関数の実引数に関数呼び出しを伴うときの評価順
テストコード
#include <iostream> using namespace std; int A() { cout << "A" << endl; return 1; } int B() { cout << "B" << endl; return 2; } int C() { cout << "C" << endl; return 3; } int D() { cout << "D" << endl; return 4; } void test(int a, int b, int c, int d) { cout << "test" << a << b << c << d << endl; } int main() { test(A(), B(), C(), D()); return 0; }
Intel Mac上のg++でコンパイルして実行するとこうなる。
D C B A test1234
Intel x86ベースのシステムでよく使われるcdecl呼出規約では、後の引数からスタックに積まれるそう。この場合、実引数の部分式の評価順序はスタックに積む順番と同じになっている。
しかしこの順序は処理系によって異なるので注意が必要とのこと。
ほかの言語でも試してみよう!