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