我想知道哪些标准,gcc编译器决定优化变量的值。 这里是样品gcc优化前增量和后增量
int a=2;
printf("%d %d\n",a++,++a);
它使输出 3 4
为什么gcc的优化和给出预增量,而不是在后增量的a
最新值?在此基础上所花费的决定呢?
我想知道哪些标准,gcc编译器决定优化变量的值。 这里是样品gcc优化前增量和后增量
int a=2;
printf("%d %d\n",a++,++a);
它使输出 3 4
为什么gcc的优化和给出预增量,而不是在后增量的a
最新值?在此基础上所花费的决定呢?
这是未定义的行为。没有指定参数的评估顺序。
该代码有两个问题。
你在同一个表情的改变a
值的两倍,它们之间没有所谓的“序列点”。这是未定义的行为任何事情都可能发生。 See the FAQ for more information。
您在传递给函数的参数中有副作用,副作用是++增量。函数参数的评估顺序是未指定的行为,这意味着编译器已经以某种方式实现了它,但我们不知道如何实现。它可能与功能不同,但从编译器到编译器肯定不同。
一个应该从不依靠不确定的或不确定的行为写代码。 Even more info in the FAQ。
这是未定义的行为,因为a在同一个表达式中被更改了两次,中间没有序列点。函数参数的求值顺序不是UB,它是_unspecified behavior_。这是两个不同的问题。 – Lundin