2013-10-01 40 views
-2

我想知道哪些标准,gcc编译器决定优化变量的值。 这里是样品gcc优化前增量和后增量

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

它使输出 3 4

为什么gcc的优化和给出预增量,而不是在后增量的a最新值?在此基础上所花费的决定呢?

回答

3

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

+3

这是未定义的行为,因为a在同一个表达式中被更改了两次,中间没有序列点。函数参数的求值顺序不是UB,它是_unspecified behavior_。这是两个不同的问题。 – Lundin

3

该代码有两个问题。

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

  • 您在传递给函数的参数中有副作用,副作用是++增量。函数参数的评估顺序是未指定的行为,这意味着编译器已经以某种方式实现了它,但我们不知道如何实现。它可能与功能不同,但从编译器到编译器肯定不同。

一个应该从不依靠不确定的或不确定的行为写代码。 Even more info in the FAQ