【发布时间】:2013-08-22 14:17:16
【问题描述】:
考虑下面的 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();)?
【问题讨论】:
-
这是一个相当学术的练习。在实践中,您不会对执行此类输出的函数的结果进行求和(或乘、减等)。
-
另外,编译器不会有固定的评估顺序。如果编译器可以通过重新排序操作进行优化,它会。