为什么sizeof(x ++)不增加x?

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

#include <stdio.h>

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

执行注1后,我预计x为6。 但是,输出是:

4 and 5

任何人都可以解释为什么在注1x不增加?


从C99标准(重点是我的)

6.5.3.4/2

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


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

作为short占据我的机器上2个字节。

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

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

将输出8


sizeof(foo)在编译时很难发现表达式的大小:

6.5.3.4:

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

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

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

上一篇: Why does sizeof(x++) not increment x?

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