如果您真的要问foo(f1(), f2(), f3())
- 哪个比 更有趣foo(1+2, 3+4, 5+6)
,因为添加 1+2 和 3+4 无论是先完成还是最后完成还是以随机顺序完成都不会产生影响。
现在,不幸的是,您不能依赖f1()
andf2()
并f3()
以任何特定的顺序被调用 - 只要每个函数都被调用一次,那么顺序是任何顺序都可以:
f1, f2, f3
f1, f3, f2
f2, f3, f1
f2, f1, f3
f3, f2, f1
f3, f1, f2
(涵盖了三个参数的所有排列)。
这完全取决于它“认为最好”的编译器。
我很久以前写了一些代码,遇到了这个特殊的问题——我有一些类似的东西:
char foo(char a, char b)
...
if (a =! 'x')
foo(fgetc(f), foo(fgetc(f)));
...
由于我希望fgetc()
首先调用 FIRST (左),然后调用第二个fgetc()
,因此我可以获得正确的行为。它在学校计算机上运行良好。然后我把代码带回家并尝试在我的家用电脑上使用它。由于某种原因,它不能正常工作。我花了很长时间才弄清楚这foo()
只是被无限调用,因为a
was never 'x'
,它停止了递归 - 因为'x'
永远不会出现在第二次调用中。
那是在两台机器上使用 gcc,但是一台是 sparc(学校计算机),而家里的一台是 x86(386,运行 OS/2,那是很久以前的事了)。
解决方案是将其分成几行:
char aa = fgetc(f);
char bb = fgetc(f);
foo(aa, foo(bb));