printf中的post增量和指针

时间:2013-09-12 19:59:07

标签: c pointers printf post-increment

有人可以解释为什么这段代码输出2 1,我认为应该在printf指令之后应用后增量。

#include <stdio.h>

int main() {
  int i=1;
  int *p=&i;
  printf("%d %d\n", *p ,i++);

  return 0;
}

2 个答案:

答案 0 :(得分:4)

标准中对此案例的评估顺序为not specified,因此您无法确定是先评估*p还是i++6.5.2.2部分i 函数调用 10 中说{:3}}:

  

函数指示符的评估顺序,实际参数和   实际参数中的子表达式未指定,但有一个序列点   在实际通话之前。

这也是C99 draft standard,因为您正在修改i并访问同一序列点中另一个表达式中6.5的先前值,{{1}}部分中的标准草案表达式 2 表示:

  

在上一个和下一个序列点之间,对象应具有其存储值   通过表达式的评估最多修改一次.72)此外,先前的值   应该只读以确定要存储的值

答案 1 :(得分:1)

逗号是一个序列点,但不在函数调用中 而printf是一个带有逗号分隔的参数的函数 在这样的表达中:
if(i+2,i++). . .逗号是一个序列点,它确保表达式将从左到右进行计算,表达式的最终值将是最右边的子表达式的值。在这种情况下i++
另一方面,在函数调用中:
function(i+1,i++,i--)逗号不是序列点,任何子表达式都可以作为第一个进行计算。唯一确定的是,它们都要进行评估,但不能按任何特定顺序进行评估。