请考虑下面的C程序:
#include <stdio.h>
int f() {
printf("f");
return 1;
}
int g() {
printf("g");
return 2;
}
int main() {
return f() + g();
}
根据C标准,由于“main”函数中的总和包含两个子表达式,并且来自C99标准的以下摘录:“§6.5(…)未指定子表达式的求值顺序以及副作用发生的顺序”,因此该程序没有单一确定性行为。因此,打印“fg”和“gf”都是该程序的有效输出。实际上,给定的编译器将选择一个固定的求值顺序(例如,在这种情况下,gcc的求值顺序是从左到右),但是如果我想可靠地比较不同编译器之间的输出,则需要确保我的程序具有单一定义行为。我的问题是:最简单的方法是什么?有没有一种方法可以避免使用临时变量(例如,“int tmp = f();return tmp + g();”)?