下面是在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是一个编译时操作符,因此在编译时Sizeof及其操作数将被结果值替换。操作数根本不会被求值(除非它是一个变长数组);只有结果的类型是重要的。

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;
}

int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;
}

输出:

2

As short在我的机器上占用了2个字节。

将函数的返回类型改为double:

double func(short x) {
// rest all same

将给出8作为输出。

其他回答

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

(sizeof x)  //this also works

这一行:

printf("%d and ", sizeof(x++)); // note 1

导致乌兰巴托。%d期望类型int而不是size_t。获得UB后,行为是未定义的,包括写入标准输出的字节。

如果你想通过将%d替换为%zu或将值转换为int来解决这个问题,但不是两者都用,你仍然不会增加x,但这是一个不同的问题,应该在不同的问题中问。

Sizeof是一个编译时操作符,因此在编译时Sizeof及其操作数将被结果值替换。操作数根本不会被求值(除非它是一个变长数组);只有结果的类型是重要的。

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;
}

int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;
}

输出:

2

As short在我的机器上占用了2个字节。

将函数的返回类型改为double:

double func(short x) {
// rest all same

将给出8作为输出。

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

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

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