printf如何在GCC中优先考虑

时间:2013-09-12 09:47:11

标签: c gcc

这是一段代码:

#include<stdio.h>

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

代码的输出是

2 1 2

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

2 1 1

请解释GCC如何评估。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

来自c99 ISO / IEC 9899:TC3 - &gt; Apenndix J:

  

J.2未定义的行为   1在以下情况下,行为未定义:

[...]

  

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

答案 1 :(得分:0)

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

  

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