这是一段代码:
#include<stdio.h>
int main() {
int i=0;
printf("%d %d %d", i, i++, ++i);
return 0;
}
代码的输出是
2 1 2
但是,如果代码从右到左进行评估,那么它应该是
2 1 1
请解释GCC如何评估。
谢谢。
答案 0 :(得分:1)
没有优先级,这是未定义的行为,因为您不允许多次在单个调用中更改相同的值。
来自c99 ISO / IEC 9899:TC3 - &gt; Apenndix J:
J.2未定义的行为 1在以下情况下,行为未定义:
[...]
- 在两个序列点之间,对象被多次修改或被修改 并且读取先前值而不是确定要存储的值(6.5)。
答案 1 :(得分:0)
函数参数的评估顺序未指定,来自C99§6.5.2.2p10:
功能指示符的评估顺序,实际 参数和实际参数中的子表达式是 未指定,但在实际调用之前有一个序列点。