sizeof(“”+ 0)!= sizeof(char *)错误或未定义的行为?
以下C程序:
#include <stdio.h>
int main(void)
{
printf("%u %u %un",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
在Linux上使用GCC编译时输出1 4 4,但在Windows上使用Microsoft Visual C ++编译时输出1 1 4。 海湾合作委员会的结果是我所期望的。 它们是不同的,因为MSVC有一个bug或者因为sizeof(“”+ 0)是未定义的? 对于两种编译器而言,无论使用什么字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的。
ANSI C标准中的相关引用似乎是6.2.2.1 - 左值和函数标识符:
“除非它是sizeof运算符的操作数......具有类型'数组类型'的左值被转换为具有类型'指向类型的指针'的表达式,该表达式指向数组对象的初始元素,而不是一个左值“。
虽然“Except”不应该应用,因为在sizeof(“”+ 0)中,数组/字符串文字是+ notof大小的操作数。
因为"fooabc"
是char[7]
类型,所以sizeof("fooabc")
与sizeof(char[7])
。 然而,数组可以被隐式地转换 - 你引用的部分 - 指针(有些人错误地称之为“衰减”),并且由于这是算术( +
)工作所必需的, ""+0
将有一种类型的char*
。 而且char指针的大小可能与数组的大小不同。 在这方面,MSVC的行为似乎破裂了。
我想这是MSVC的错误。
""+0
取""
(在char*
类型中衰减)的地址,并将0和它相加。 该表达式类型是char*
。
玩一下: ""+0
的价值是什么? 和""+1
? 和sizeof(""+1)
?
看起来像MSVC中的错误。 显然它是优化器在进行适当的类型分析之前删除+0
。
上一篇: sizeof(""+0) != sizeof(char *) Bug or undefined behaviour?
下一篇: How using try catch for exception handling is best practice