foo(a = b+c);
//new value of a(after the call) = b+c
//but
sizeof(a = b+c);
//new value of a = old value of a
为什么在后一种情况下,函数堆栈(包含上面的代码)中反映的赋值语句的结果是不是?
答案 0 :(得分:6)
sizeof
是一个运算符而非函数。除非是可变长度数组,否则不会评估sizeof
的操作数。
C11:6.5.3.4 p(2):
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型确定。结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。
答案 1 :(得分:2)
sizeof
不评估其操作数。
size_t x = sizeof(i++); // i is not incremented
除了涉及可变长度数组时:
(C99,6.5.3.4p2)“如果操作数的类型是可变长度数组类型,则评估操作数;否则,不评估操作数,结果是整数常量。”
size_t y = sizeof(int [j++]); // j is incremented;
(C99,6.7.5.2p4)“如果size表达式是sizeof运算符的操作数的一部分,并且更改size表达式的值不会影响运算符的结果,则不指定大小是否大小表达式被评估。“
size_t z = sizeof (*(int (*)[k++]) 0); // k may or may not be incremented
// gcc increments k