下面是在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之后没有增加吗?
下面是在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 x) //this also works
其他回答
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是一个编译时内置操作符,不是一个函数。在不带括号的情况下,这一点变得非常明显:
(sizeof x) //this also works
来自C99标准(重点是我的)
6.5.3.4/2 sizeof操作符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算该操作数;否则,操作数不计算,结果为整数常数。
在编译期间不能执行。所以++i/i++不会发生。sizeof(foo())也不会执行函数,而是返回正确的类型。