这是在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。 但是,输出为:
4 and 5
谁能解释为什么音符1之后x
不会增加?
#1楼
sizeof()
运算符仅给出数据类型的大小,它不评估内部元素。
#2楼
注意
此答案是从重复副本中合并而成的,这解释了延迟日期。
原版的
除了可变长度数组, sizeof不会评估其参数。 我们可以从C99标准草案第6.5.3.4
节“ sizeof运算符第2段”中看到这一点:
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小由操作数的类型确定。 结果是一个整数。 如果操作数的类型是可变长度数组类型,则对操作数求值; 否则,不评估操作数,结果为整数常量。
一个注释( 现已删除 )询问这样的事情是否会在运行时评估:
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++] )
#3楼
sizeof
在编译时运行,但是x++
只能在运行时评估。 为了解决这个问题,C ++标准规定不对sizeof
的操作数求值(VLA除外)。 C标准说:
如果[
sizeof
]的操作数的sizeof
是可变长度数组类型,则对操作数求值; 否则,不评估操作数,结果为整数常量。
#4楼
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
作为输出。
#5楼
来自C99标准 (重点是我的)
6.5.3.4/2
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小由操作数的类型确定。 结果是一个整数。 如果操作数的类型是可变长度数组类型,则对操作数求值; 否则, 不评估操作数 ,结果为整数常量。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3159263