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

链接地址: http://www.djcxy.com/p/21133.html

上一篇: sizeof(""+0) != sizeof(char *) Bug or undefined behaviour?

下一篇: How using try catch for exception handling is best practice