sizeof(""+ 0)!= sizeof(char*)错误或未定义的行为?

cde*_*dev 15 c sizeof undefined-behavior

以下C程序:

#include <stdio.h>

int main(void)
{
    printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Linux上使用GCC编译时输出1 4 4,但在Windows上使用Microsoft Visual C++编译时输出1 1 4.海湾合作委员会的结果是我所期待的.它们是否有区别,因为MSVC有错误或者因为sizeof(""+ 0)未定义?对于两个编译器,无论使用什么字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的.

ANSI C标准中的相关参考似乎是6.2.2.1 - 左值和函数指示符:

"除非它是sizeof运算符的操作数...具有类型'数组类型'的左值被转换为具有类型'指向类型的指针'的表达式,该表达式指向数组对象的初始元素,而不是一个左值".

这里虽然"Except"不适用,因为在sizeof(""+ 0)中,数组/字符串文字是+而不是sizeof的操作数.

use*_*374 7

因为"fooabc"是类型char[7],sizeof("fooabc")产量相同sizeof(char[7]).但是,数组可以隐式转换 - 你引用的部分 - 指针(有些人错误地称之为"衰变"),并且因为这是算术(+)工作所必需的,所以""+0会有一个类型char*.并且char指针可以具有与数组不同的大小.在这方面,MSVC的行为似乎被打破了.