下面是在dev c++ windows中编译的代码:

#include <stdio.h>

int main() {
    int x = 5;
    printf("%d and ", sizeof(x++)); // note 1
    printf("%d\n", x); // note 2
    return 0;
}

我期望在执行注释1后x为6。然而,输出结果是:

4 and 5

有人能解释一下为什么x在注释1之后没有增加吗?


当前回答

Sizeof在编译时运行,但x++只能在运行时求值。为了解决这个问题,c++标准规定不计算sizeof的操作数。C标准说:

如果操作数[of sizeof]的类型是变长数组类型,则计算该操作数;否则,操作数不计算,结果为整数常数。

其他回答

Sizeof()操作符只给出数据类型的大小,它不计算内部元素。

在编译期间不能执行。所以++i/i++不会发生。sizeof(foo())也不会执行函数,而是返回正确的类型。

Sizeof (foo)在编译时非常努力地发现表达式的大小:

6.5.3.4:

sizeof操作符产生其操作数的大小(以字节为单位),该操作数可以是 表达式或类型的圆括号名称。尺寸是由类型决定的 操作数。结果是一个整数。如果操作数的类型是可变长度数组 类型,则对操作数求值;否则,操作数不求值,结果为 整型常量。

简而言之:可变长度数组,在运行时运行。(注意:可变长度数组是一个特定的特性——不是由malloc(3)分配的数组。)否则,只计算表达式的类型,并在编译时计算表达式的类型。

Sizeof是一个编译时内置操作符,不是一个函数。在不带括号的情况下,这一点变得非常明显:

(sizeof x)  //this also works

来自C99标准(重点是我的)

6.5.3.4/2 sizeof操作符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算该操作数;否则,操作数不计算,结果为整数常数。