class Point {
int x, y;
Point& operator++() { ++x; ++y; return *this; }
int getx() { return x; }
int gety() { return y; }
};
Point a(5,5);
cout << (++a).getx() << " " << (++a).gety() << endl; // 輸出 7 6
C++ 標準(C++17 前)未規定函數參數的求值順序。編譯器可自由選擇先計算左參數還是右參數。
(++a).gety():
++a → x=6, y=6,返回引用。.gety() → 返回 6。(++a).getx():
++a → x=7, y=7。.getx() → 返回 7。7 6。可能輸出 6 7。跨編譯器不可移植。
// 拆分語句,明確順序
++a;
int x = a.getx();
++a;
int y = a.gety();
cout << x << " " << y; // 穩定輸出 6 7
C++17 規定運算符調用的求值順序:左操作數先於右操作數。但函數參數順序仍未規定。升級編譯器並開啟 -std=c++17 可獲得更可預期行為,但最好仍避免依賴求值順序的代碼。
博客深度分析:C++ 求值順序詳解