如果你真的问foo(f1(), f2(), f3())
- 这比foo(1+2, 3+4, 5+6)
,因为无论是先做还是最后做还是以随机顺序添加 1+2 和 3+4 都不会产生影响。
现在,不幸的是,你不能依赖f1()
and f2()
and 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()
第一个被调用,第二个被调用fgetc()
,我可以获得正确的行为。而且在学校电脑上运行得很好。然后我把代码带回家并尝试在我的家用计算机上使用它。由于某种原因,它无法正常工作。我花了很长时间才弄清楚foo()
只是被无限地调用,因为a
从来没有'x'
,这会停止递归 - 因为'x'
永远不会出现在第二次通话中。
那是在两台机器上都使用 gcc,但一台是 sparc(学校计算机),家里一台是 x86(386,运行 OS/2,那是很久以前的事了)。
解决方案是将其分成几行:
char aa = fgetc(f);
char bb = fgetc(f);
foo(aa, foo(bb));