3 回答

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
是的,它要求(評估順序和短路)。在您的示例中,如果所有函數(shù)都返回true,則調(diào)用的順序嚴(yán)格來自functionA,然后是functionB,然后是functionC。用于此類似
if(ptr && ptr->value) { ...}
逗號運算符相同:
// calls a, then b and evaluates to the value returned by b// which is used to initialize cint c = (a(), b());
一個表示的左邊和右邊的操作數(shù)之間&&
,||
,,
和的第一和第二/第三操作數(shù)之間?:
(條件運算符)是一個“點序列”。在此之前完全評估任何副作用。所以,這是安全的:
int a = 0;int b = (a++, a); // b initialized with 1, and a is 1
請注意,不要將逗號運算符與用于分隔事物的語法逗號混淆:
// order of calls to a and b is unspecified!function(a(), b());
C ++標(biāo)準(zhǔn)中說5.14/1
:
&&運算符從左到右分組。操作數(shù)都隱式轉(zhuǎn)換為bool類型(第4節(jié))。如果兩個操作數(shù)都為真,則結(jié)果為true,否則為false。與&不同,&&保證從左到右的評估:如果第一個操作數(shù)為假,則不評估第二個操作數(shù)。
并在5.15/1
:
|| 操作員組從左到右。操作數(shù)都隱式轉(zhuǎn)換為bool(第4節(jié))。如果其任一操作數(shù)為true,則返回true,否則返回false。與|,||不同 保證從左到右的評估; 此外,如果第一個操作數(shù)的計算結(jié)果為true,則不計算第二個操作數(shù)。
它說旁邊的那些:
結(jié)果是布爾。除了臨時破壞之外,第一個表達(dá)式的所有副作用(12.2)發(fā)生在評估第二個表達(dá)式之前。
除此之外,1.9/18
說
在評估每個表達(dá)式時
a && b
a || b
a ? b : C
a , b
使用這些表達(dá)式(5.14,5.15,5.16,5.18)中運算符的內(nèi)置含義,在評估第一個表達(dá)式后有一個序列點。
- 3 回答
- 0 關(guān)注
- 695 瀏覽
添加回答
舉報