日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

作者:清風(fēng)自在?流水潺潺 ? 更新時間: 2022-07-29 編程語言

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

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

下面看一個邏輯表達(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)算符的使用

二、重載邏輯操作符

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

下面看一個重載邏輯操作符示例:

#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ù)對邏輯操作符進(jìn)行重載

三、小結(jié)

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

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/124550630

欄目分類
最近更新