15

以下 C 程序:

#include <stdio.h>

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

1 4 4在 Linux 上使用 GCC 编译时输出,但在1 1 4Windows 上使用 Microsoft Visual C++ 编译时输出。GCC 结果是我所期望的。它们不同是因为 MSVC 有错误还是因为sizeof(""+0)未定义?对于这两种编译器,无论您使用什么字符串文字或整数常量,其行为(即打印的中间值是等于第一个值还是最后一个值)都是相同的。

ANSI C 标准中的相关参考似乎是 6.2.2.1 - Lvalues and function designators:

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

在这里,虽然“除外”不应该适用,因为在sizeof(""+0)数组/字符串文字中是+not的操作数sizeof

4

3 回答 3

7

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

于 2011-02-01T12:29:23.470 回答
1

我猜这是MSVC的错误。

""+0获取""(在 type 中衰减char*)的地址并将 0 加到它。该表达式类型是char*.

试一试: 的价值是""+0多少?和""+1?和sizeof(""+1)

于 2011-02-01T12:30:53.143 回答
1

看起来像 MSVC 中的错误。显然,它的优化器+0在进行适当的类型分析之前删除了。

于 2011-02-01T12:31:04.780 回答