這個增量後運營商的使用是混亂。差異增量運營商的工作與&和運營商
{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}
輸出
1,2,2,1
的c
價值並沒有增加,但如果我&&
運營商更換它增加。爲什麼?
這個增量後運營商的使用是混亂。差異增量運營商的工作與&和運營商
{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}
輸出
1,2,2,1
的c
價值並沒有增加,但如果我&&
運營商更換它增加。爲什麼?
引用C11
,章§6.5.14,(重點煤礦)
不同的是按位
|
運營商,該運營商||
保證左到右的評價;如果對第二個操作數進行求值,則在第一個操作數的第一個操作數和第二個操作數的評估之間有一個序列點。 如果第一個操作數比較不等於0
,則第二個操作數是 未評估。
所以,你的情況,
d=a++||b++||c++
相同
d= ((a++ || b++) || c++)
之後,第一個括號裏面的語句求,第一a++
(後增)的計算結果爲0(副作用待定),因此評估第一個||
的RHS,b++
,產生1和||
操作的結果爲真,產量爲1.
該結果爲1
爲第二個||
的LHS。因此,第二個||
(c++
)的RHS不再被評估並且最終結果變爲TRUE,再次產生1
,其存儲在d
中。
所以,最後,
a++
進行評價時,變爲1b++
進行評價時,變爲2c++
是不評價,保持2||
結果存儲在d
,這是真實的,所以商店1.在另一方面,用於邏輯與運算符&&
,
[...]如果第一操作數進行比較等於0,第二個 操作數未評價。
所以,如果你有&&
替換最後一個||
,那麼對於外說法,LHS變爲1和RHS評估,使得c++
進行評估和增加,作爲一個副作用。
@Olaf,但在這種情況下,這不是UB。都是不同的變量。 –
但爲什麼這不是和運算符 –
@SanyaPandey:你有效地問:「'''和'&&'操作符如何工作」。請閱讀兩個操作員的說明。你會發現,在每一個良好的C書或通過簡單的搜索在線。請注意,您需要至少自己努力才能找到答案。 – Olaf
@奧拉夫先生,我恭敬地不同意。這不是一個騙局,至少不是那個。 –
@SouravGhosh:你可能是對的,我可能會錯過。儘管如此,OP和OP的含義並不完全清楚。您的編輯意味着符合邏輯的「和」,我現在傾向於同意,但我們最好先要求OP進行澄清(在編輯之前,我在重複投票之前)。我確信還有另外一個重複,但我的確在這裏錯了。 – Olaf
這是邏輯「和」 –