在c中的sizeof函数内部赋值

时间:2014-07-16 15:20:36

标签: c sizeof

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

为什么在后一种情况下,函数堆栈(包含上面的代码)中反映的赋值语句的结果是不是?

2 个答案:

答案 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