有人可以解释为什么这段代码输出2 1
,我认为应该在printf指令之后应用后增量。
#include <stdio.h>
int main() {
int i=1;
int *p=&i;
printf("%d %d\n", *p ,i++);
return 0;
}
答案 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--)
逗号不是序列点,任何子表达式都可以作为第一个进行计算。唯一确定的是,它们都要进行评估,但不能按任何特定顺序进行评估。