这是在dev c ++窗口中编译的代码: 数组
#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。 可是,输出为: app
4 and 5
谁能解释为何音符1以后x
不会增长? 函数
sizeof()
运算符仅给出数据类型的大小,它不评估内部元素。 this
注意 spa
此答案是从重复副本中合并而成的,这解释了延迟日期。 rest
原版的 code
除了可变长度数组, sizeof不会评估其参数。 咱们能够从C99标准草案第6.5.3.4
节“ sizeof运算符第2段”中看到这一点: get
sizeof运算符产生其操做数的大小(以字节为单位),该操做数能够是表达式或类型的括号名称。 大小由操做数的类型肯定。 结果是一个整数。 若是操做数的类型是可变长度数组类型,则对操做数求值; 不然,不评估操做数,结果为整数常量。 io
一个注释( 现已删除 )询问这样的事情是否会在运行时评估: 编译
sizeof( char[x++] ) ;
确实能够,像这样的东西也能够工做( 看到他们两个都活着 ):
sizeof( char[func()] ) ;
由于它们都是可变长度数组。 虽然,我都没有发现任何实际用途。
注意,可变长度数组在C99标准草案第6.7.5.2
节“ 数组声明器”第4节中进行了介绍 :
[...]若是大小是整数常量表达式,而且元素类型具备已知的常量大小,则数组类型不是可变长度数组类型; 不然,数组类型为可变长度数组类型。
更新资料
在C11中,答案针对VLA状况而改变,在某些状况下,不肯定是否评估大小表达式。 从6.7.6.2
节的数组声明 6.7.6.2
:
若是大小表达式是sizeof运算符的操做数的一部分,而且更改大小表达式的值不会影响该运算符的结果,则不肯定是否评估该大小表达式。
例如,在这种状况下( 现场观看 ):
sizeof( int (*)[x++] )
sizeof
在编译时运行,可是x++
只能在运行时评估。 为了解决这个问题,C ++标准规定不对sizeof
的操做数求值(VLA除外)。 C标准说:
若是[
sizeof
]的操做数的sizeof
是可变长度数组类型,则对操做数求值; 不然,不评估操做数,结果为整数常量。
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
做为输出。
来自C99标准 (重点是个人)
6.5.3.4/2
sizeof运算符产生其操做数的大小(以字节为单位),该操做数能够是表达式或类型的括号名称。 大小由操做数的类型肯定。 结果是一个整数。 若是操做数的类型是可变长度数组类型,则对操做数求值; 不然, 不评估操做数 ,结果为整数常量。