0

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

#include <stdio.h>

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

  return 0;
}
4

2 回答 2

4

标准中未指定此案例的评估顺序,因此您无法确定是否先评估*pi++将先评估。C99 标准草案6.5.2.2 函数调用10段中说:

函数指示符、实际参数和实际参数中的子表达式的求值顺序是未指定的,但在实际调用之前有一个序列点。

这也是未定义的行为,因为您正在修改i和访问同一序列点内另一个表达式中的先前值,表达式2i节中的标准草案说:6.5

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

于 2013-09-12T20:04:15.263 回答
1

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

于 2013-09-12T20:11:23.260 回答