预增量中的gcc优化&后增量

时间:2013-10-01 10:57:37

标签: c linux gcc compiler-optimization

我想知道什么标准,gcc编译器决定优化变量的值。 这是样本

int a=2;
printf("%d %d\n",a++,++a);

它提供输出 3 4

为什么gcc在预增量中优化并给出a的最新值而不是在后增量中?在哪个基础上需要做出决定?

2 个答案:

答案 0 :(得分:3)

这是未定义的行为。没有指定参数的指定顺序。

答案 1 :(得分:3)

代码有两个问题。

  • 您在同一个表达式中两次更改a的值,它们之间没有所谓的“序列点”。这是未定义的行为,任何事情都可能发生。 See the FAQ for more information

  • 传递给函数的参数有副作用,副作用是++增量。函数参数的评估顺序是未指定的行为,这意味着编译器已经以某种方式实现了它,但是我们不知道如何实现它。它可能因功能而异,当然也不同于编译器和编译器。

应该从不编写依赖于未定义或未指定行为的代码。 Even more info in the FAQ