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