欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++超詳細(xì)講解邏輯操作符

 更新時(shí)間:2022年06月01日 08:39:16   作者:清風(fēng)自在?流水潺潺  
在C語言中,邏輯運(yùn)算符有&&、||、!;&&表示“與”的意思,需要兩端的表達(dá)式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達(dá)式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換

一、邏輯運(yùn)算符的原生語義

  1. 操作數(shù)只有兩種值( true和 false )邏
  2. 輯表達(dá)式不用完全計(jì)算就能確定最終值
  3. 最終結(jié)果只能是 true 或者 false

下面看一個(gè)邏輯表達(dá)式的代碼:

#include <iostream>
#include <string>
using namespace std;
int func(int i)
{
    cout << "int func(int i): i = " << i << endl;
    return i;
}
int main()
{
    if (func(0) && func(1))
    {
        cout << "Result is true!" << endl;
    }
    else 
    {
        cout << "Result is False!" << endl;
    }
    cout << endl;
    if (func(0) || func(1))
    {
        cout << "Result is true!" << endl;
    }
    else 
    {
        cout << "Result is False!" << endl;
    } 
    return 0;
}

輸出結(jié)果如下:

這就是邏輯操作符的短路規(guī)則,可以參照我之前寫的詳細(xì)講解邏輯運(yùn)算符的使用

二、重載邏輯操作符

邏輯操作符可以重載嗎?重載邏輯操作符有什么意義?

下面看一個(gè)重載邏輯操作符示例:

#include <iostream>
using namespace std;
class Test
{
    int mValue;
public:
    Test(int v)
    {
        mValue = v;
    }
    int value() const
    {
        return mValue;
    }
};
bool operator &&(const Test& l, const Test& r)
{
    return l.value() && r.value();
}
bool operator ||(const Test& l, const Test& r)
{
    return l.value() || r.value();
}
Test func(Test i)
{
    cout << "Test func(Test i): i.value() = " << i.value() << endl;
    return i;
}
int main()
{
    Test t0(0);
    Test t1(1);
    if (func(t0) && func(t1))
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    cout << endl;
    if (func(t0) || func(t1))
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
}

輸出結(jié)果如下:

按照短路法則,func(t0) && func(t1) 應(yīng)該只執(zhí)行 func(t0),這里卻輸出了func(t0) 和 func(t1) 運(yùn)行后的值,這是為什么呢?且看下面解析。

問題的本質(zhì)分析

  1. C++ 通過函數(shù)調(diào)用擴(kuò)展操作符的功能
  2. 進(jìn)入函數(shù)體前必須完成所有參數(shù)的計(jì)算
  3. 函數(shù)參數(shù)的計(jì)算次序是不定的
  4. 短路法則完全失效

邏輯操作符重載后無法完全實(shí)現(xiàn)原生的語義。

上述代碼等效寫法如下:

#include <iostream>
using namespace std;
class Test
{
    int mValue;
public:
    Test(int v)
    {
        mValue = v;
    }
    int value() const
    {
        return mValue;
    }
};
bool operator &&(const Test& l, const Test& r)
{
    return l.value() && r.value();
}
bool operator ||(const Test& l, const Test& r)
{
    return l.value() || r.value();
}
Test func(Test i)
{
    cout << "Test func(Test i): i.value() = " << i.value() << endl;
    return i;
}
int main()
{
    Test t0(0);
    Test t1(1);
    if (operator && (func(t0), func(t1)))
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    cout << endl;
    if (operator || (func(t0), func(t1)))
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
}

輸出結(jié)果和上面一樣:

將func(t0) && func(t1) 改寫成operator && (func(t0), func(t1)),就不難理解為什么了。核心就兩點(diǎn):

1.進(jìn)入函數(shù)體前必須完成所有參數(shù)的計(jì)算

2.函數(shù)參數(shù)的計(jì)算次序是不定的

一些有用的建議

  • 實(shí)際工程開發(fā)中避免重載邏輯操作符
  • 通過重載比較操作符代替邏輯操作符重載
  • 直接使用成員函數(shù)代替邏輯操作符重載
  • 使用全局函數(shù)對(duì)邏輯操作符進(jìn)行重載

三、小結(jié)

  • C++ 從語法上支持邏輯操作符重載
  • 重載后的邏輯操作符不滿足短路法則
  • 工程開發(fā)中不要重載邏輯操作符
  • 通過重載比較操作符替換邏輯操作符重載
  • 通過專用成員函數(shù)替換邏輯操作符重載

到此這篇關(guān)于C++超詳細(xì)講解邏輯操作符的文章就介紹到這了,更多相關(guān)C++邏輯操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)分水嶺算法(Watershed Algorithm)

    C++實(shí)現(xiàn)分水嶺算法(Watershed Algorithm)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)分水嶺算法Watershed Algorithm,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一 下
    2018-01-01
  • C++ 類訪問控制的條件總結(jié)

    C++ 類訪問控制的條件總結(jié)

    這篇文章主要介紹了C++ 類訪問控制的條件總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中的vector容器對(duì)象學(xué)習(xí)筆記

    C++中的vector容器對(duì)象學(xué)習(xí)筆記

    這篇文章主要介紹了C++中的vector容器對(duì)象學(xué)習(xí)筆記,其中文章最后標(biāo)紅的resize與reserve方法的差別特別需要注意,需要的朋友可以參考下
    2016-05-05
  • C 語言關(guān)于聯(lián)合體的相關(guān)知識(shí)

    C 語言關(guān)于聯(lián)合體的相關(guān)知識(shí)

    這篇文章主要介紹了C 語言關(guān)于聯(lián)合體的相關(guān)知識(shí),文中講解非常細(xì)致,代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++運(yùn)算符重載圖文詳解

    C++運(yùn)算符重載圖文詳解

    運(yùn)算符重載的方法是定義一個(gè)重載運(yùn)算符的函數(shù),在需要執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)就自動(dòng)調(diào)用該函數(shù),以實(shí)現(xiàn)相應(yīng)的運(yùn)算。也就是說,運(yùn)算符重載是通過定義函數(shù)實(shí)現(xiàn)的
    2021-09-09
  • 基于C++編寫一個(gè)密碼系統(tǒng)

    基于C++編寫一個(gè)密碼系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個(gè)簡(jiǎn)單的密碼系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 解讀C++中枚舉(enum)的使用

    解讀C++中枚舉(enum)的使用

    對(duì)于開發(fā)C++來說,枚舉是一個(gè)幾乎必然用到的功能。當(dāng)然今天要講的枚舉肯定不是平常漫不經(jīng)心的使用,而是從里到外地深扒它。本文就來逐漸揭開它神秘地面紗,發(fā)現(xiàn)一些未曾注意到的東西吧
    2023-03-03
  • C++11新特性“=default”,“=delete”的使用

    C++11新特性“=default”,“=delete”的使用

    =default、=delete 是C++11的新特性,分別為:顯式缺省(告知編譯器生成函數(shù)默認(rèn)的缺省版本)和顯式刪除(告知編譯器不生成函數(shù)默認(rèn)的缺省版本),本文就來介紹一下如何使用
    2021-05-05
  • 利用Matlab實(shí)現(xiàn)陰影柱狀圖的繪制

    利用Matlab實(shí)現(xiàn)陰影柱狀圖的繪制

    陰影柱狀圖繪制的代碼MATHWORKS上也有,不過是生成圖片后,識(shí)別圖像上不同顏色塊并直接修改像素生成陰影線。這樣的生成方式不可逆且自由度較低,所以本文為大家?guī)淼氖且粋€(gè)直接畫線條填充的硬畫版本,希望有所幫助
    2022-09-09
  • C語言每日練習(xí)之冒泡排序

    C語言每日練習(xí)之冒泡排序

    這篇文章主要介紹了C語言冒泡排序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11

最新評(píng)論