[英]c++ logical alternative operator
在一個簡單的項目工作期間,我發現了一些我不完全理解的情況。 考慮以下代碼:
#include <iostream>
using namespace std;
bool test(int k)
{
cout << "start " << k << endl;
bool result; // it is important that result's value is opposite to initial value of recheck in main()
result = false;
return result;
}
int main()
{
bool recheck;
recheck = true;
for (int i = 2; i > -1; i--)
{
recheck = (recheck || test(i)); // (1)
cout << i << " ???" <<endl;
}
cout << "----------------------------" << endl;
cout << endl;
recheck = true;
for (int i = 2; i > -1; i--)
{
recheck = (test(i) || recheck); //different order that in (1)
cout << i << "???" <<endl;
}
return 0;
}
它從for
循環返回完全不同的結果:
2 ???
1 ???
0 ???
----------------------------
start 2
2???
start 1
1???
start 0
0???
似乎第一個test(int k)
甚至沒有被調用。 我懷疑它與||
運營商。 任何人都可以解釋這種行為嗎?
內置的||
短路:如果左操作數為true
,則不評估右操作數(右操作數的值是什么並不重要,因為在這種情況下, ||
表達式的值保證為true
)。
為了完整性,但與問題沒有特別相關:在c ++中, ||
運算符是可重載的,就像許多其他運算符一樣。 如果使用過載,則不會發生短路。
布爾運算符||
當其中一個操作數(從左到右進行評估)可以確定表達式的結果而不參考剩余的操作數時, &&
將短路 。
在||
的情況下 ,這意味着如果第一個操作數為true
,則不計算剩余的操作數,因為整個表達式的結果將始終為true
。
在第一個循環中,變量recheck
( main
本地變量)始終為true
,因此函數調用test
永遠不需要進行評估:它被跳過,並且您看不到輸出。
在第二個循環中,首先計算test
函數調用,並且只能在調用函數后確定結果,因此在每次迭代時都會調用該函數,並且您會看到輸出。
你的評論說:
重要的是結果的值與main()中的重新檢查的初始值相反
你的test()
函數當前看不到recheck
的值,這是main()
本地值。
假設您的評論反映了您的意圖,您需要將recheck
作為參數傳遞給test()
; 你可以使用一元!
運算符,類似於:
result = ! recheck;
當然,您需要修復main()
的邏輯,以便在需要時調用test()
。
您的要求不夠明確,我無法進一步評論。
其他人已經解決了您提出的具體問題。 請注意,要注意連續使用多個問號。 Trigraph序列以兩個'??'開頭 字符和兩個問號后的第三個字符的解釋方式不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.