-1

这是一个代码:

#include<stdio.h>

int main() {
    int i=0;
    printf("%d %d %d", i, i++, ++i);
    return 0;
}

代码的输出是

2 1 2

但是,如果代码从右到左进行评估,那么它应该是

2 1 1

请解释 GCC 是如何评估的。

谢谢你。

4

2 回答 2

1

没有优先级,这是未定义的行为,因为您不允许在一次调用中多次更改相同的值。

从 c99 ISO/IEC 9899:TC3 -> 附录 J:

J.2 未定义行为 1 在下列情况下行为未定义:

[...]

— 在两个序列点之间,一个对象被修改了不止一次,或者被修改并读取了先前的值,而不是确定要存储的值(6.5)。

于 2013-09-12T09:48:37.097 回答
0

未指定函数参数的评估顺序,来自 C99 §6.5.2.2p10:

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

于 2013-09-12T09:50:00.310 回答