C++ 中表達式求值
阿新 • • 發佈:2020-10-10
首先我們來看一段程式碼:
int a() { return std::puts("a"); }
int b() { return std::puts("b"); }
int c() { return std::puts("c"); }
void z(int, int, int) {}
int main() {
z(a(), b(), c()); // 允許全部 6 種輸出排列
return a() + b() + c(); // 允許全部 6 種輸出排列
}
這段程式碼是cppreference網站中對與表示式求值順序,做的一個引入介紹。這個程式碼中說的就是對於表示式求值順序規則:若某個函式呼叫既不按順序早於又不按順序晚於另一函式呼叫,則它們是順序不確定。
這段程式碼的輸出結果可能為:
a
b
c
a
b
c
//或者
b
a
c
a
c
b
//其實順序完全不確定,進行排列組合會有多種輸出順序。
平時求值順序不確定的情況,主要有以下四種:
1、若某個函式呼叫既不按順序早於又不按順序晚於另一函式呼叫,則它們是順序不確定的
2、對分配函式(operator new)的呼叫相對於 new 表示式中建構函式引數的求值來說,是順序不確定的(c++17後先構造後分配)
3、函式呼叫表示式中,每個形參的初始化的值計算和副作用相對於任何其他形參的初始化的值計算和副作用是順序不確定的。
4、帶括號的初始化器中的逗號分隔的表示式列表中的每個表示式,如同函式呼叫一般求值(順序不確定)。