以下是一个C程序:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
在Linux上使用GCC编译时,输出为1 4 4
,但在Windows上使用Microsoft Visual C++编译时,输出为1 1 4
。我预期的结果是GCC的结果。它们的差异是因为MSVC有一个错误还是因为sizeof(""+0)
是未定义的?对于两个编译器,无论使用哪个字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的。ANSI C标准中6.2.2.1 - Lvalues and function designators中相关的参考文献如下:
然而,在除非它是 sizeof 操作符的操作数...否则,具有'type'数组类型的lvalue将转换为具有指向数组对象的初始元素的'type'指针类型的表达式,并且不是lvalue。
sizeof(""+0)
中,“Except”不应该适用,因为数组/字符串文字是+
的操作数,而不是sizeof
的操作数。
'\0'
替换""
将违反类型系统。更有趣的是,sizeof(""+1)
是多少? - Fred Foosizeof
是size_t
类型,必须使用%zu
进行打印。 - phuclv