1+2 と 3+4 を追加しても、最初か最後かランダムな順序で実行しても効果がないため、これfoo(f1(), f2(), f3())
は よりも興味深いものです。foo(1+2, 3+4, 5+6)
残念ながら、f1()
and とf2()
andf3()
が特定の順序で呼び出されることに依存することはできません。各関数が一度だけ呼び出される限り、順序はどのような順序でもかまいません。
f1, f2, f3
f1, f3, f2
f2, f3, f1
f2, f1, f3
f3, f2, f1
f3, f1, f2
(これは、3 つのパラメーターのすべての順列をカバーしています)。
それは完全に「最善と考える」コンパイラ次第です。
私はずっと前にいくつかのコードを書き、この特定の問題に遭遇しました-私は次の行に沿って何かを持っていました:
char foo(char a, char b)
...
if (a =! 'x')
foo(fgetc(f), foo(fgetc(f)));
...
FIRST (左)fgetc()
が最初に呼び出され、2 番目が呼び出されると予想していたのでfgetc()
、正しい動作を得ることができました。そして、学校のコンピューターで問題なく動作しました。次に、コードを家に持ち帰り、自宅のコンピューターで使用してみました。そして、何らかの理由でそれが正しく機能しませんでした。foo()
が無限に呼び出されているa
こと'x'
を理解するのにかなりの時間がかかりました'x'
。
両方のマシンで gcc を使用していましたが、1 つは sparc (学校のコンピューター) で、自宅の 1 つは x86 (386、OS/2 を実行、それはずっと前のことです) でした。
解決策は、いくつかの行に分割することです。
char aa = fgetc(f);
char bb = fgetc(f);
foo(aa, foo(bb));