Why does sizeof(x++) not increment x?
Here is the code compiled in 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;
}
I expect x
to be 6 after executing note 1 . However, the output is:
4 and 5
Can anyone explain why x
does not increment after note 1 ?
From the C99 Standard (the emphasis is mine)
6.5.3.4/2
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
sizeof
is a compile-time operator , so at the time of compilation sizeof
and its operand get replaced by the result value. The operand is not evaluated (except when it is a variable length array) at all; only the type of the result matters.
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;
}
Output:
2
as short
occupies 2 bytes on my machine.
Changing the return type of the function to double
:
double func(short x) {
// rest all same
will give 8
as output.
sizeof(foo)
tries really hard to discover the size of an expression at compile time:
6.5.3.4:
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
In short: variable length arrays, run at runtime. (Note: Variable Length Arrays are a specific feature -- not arrays allocated with malloc(3)
.) Otherwise, only the type of the expression is computed, and that at compile time.
上一篇: C(GCC)中sizeof()的行为
下一篇: 为什么sizeof(x ++)不增加x?