簡體   English   中英

c ++邏輯替代運算符

[英]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

在第一個循環中,變量recheckmain本地變量)始終為true ,因此函數調用test永遠不需要進行評估:它被跳過,並且您看不到輸出。

在第二個循環中,首先計算test函數調用,並且只能在調用函數后確定結果,因此在每次迭代時都會調用該函數,並且您會看到輸出。

你的評論說:

重要的是結果的值與main()中的重新檢查的初始值相反

你的test()函數當前看不到recheck的值,這是main()本地值。

假設您的評論反映了您的意圖,您需要將recheck作為參數傳遞給test() ; 你可以使用一元! 運算符,類似於:

result = ! recheck;

當然,您需要修復main()的邏輯,以便在需要時調用test()

您的要求不夠明確,我無法進一步評論。

其他人已經解決了您提出的具體問題。 請注意,要注意連續使用多個問號。 Trigraph序列以兩個'??'開頭 字符和兩個問號后的第三個字符的解釋方式不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM