zoukankan      html  css  js  c++  java
  • 第38课 逻辑操作符的陷阱

    1. 逻辑运算符原生语义

    (1)操作数只有两种值truefalse

    (2)逻辑表达式不用完全计算就能确定最终值

    (3)最终结果只能是truefalse

    【编程实验】逻辑表达式   38-1.cpp

    #include <iostream>
    
    using namespace std;
    
     
    
    int func(int i)
    
    {
    
        cout << "int func(int i): i = " << i << endl;
    
        return i;
    
    }
    
     
    
    int main()
    {
    
        //&&的短路:只有一个为0就短路
    
        //int func(int i): i = 0
    
        //Result: false   
    
        if(func(0) && func(1))
    
        {
    
            cout << "Result: true" << endl;
    
        }
    
        else
    
        {
    
            cout << "Result: false" << endl;
    
        }
    
       
    
        cout << endl;
    
       
    
        //||的短路:只要1个为1,就短路
    
        //输出:
    
        //int func(int i): i = 1
    
        //Result: true
    
        if(func(0) || func(1))
    
        {
    
            cout << "Result: true" << endl;
    
        }
    
        else
    
        {
    
            cout << "Result: false" << endl;
    
        }
    
     
    
        return 0;
    
    }

    运行结果:

      

    2. 重载逻辑操作符

    (1)重载出现的问题及分析

      ①C++通过函数调用扩展操作符的功能

      ②进入函数体前必须完成所有参数的计算

      ③函数参数计算次序不定的

      ④短路法则完全失效

    (2)逻辑操作符重载无法完全实现原生的意义

    (3)一些有用的建议

      ①实际工程开发中避免重载逻辑操作符

      ②通过重载比较操作符代替逻辑操作符重载

      ③使用成员函数代替逻辑操作符重载

      ④使用全局函数逻辑操作符进行重载

    【编程实验】操作逻辑运算符   38-2.cpp

    #include <iostream>
    
    using namespace std;
    
     
    
    class Test
    {
    
        int mValue;
    
    public:
    
        Test(int v){ mValue = v;}
    
       
    
        int value()const
    
        {
    
            return mValue;
    
        }
    
    };
    
     
    
    //利用全局函数重载&&操作符
    
    bool operator && (const Test& lp, const Test& rp)
    
    {
    
        return lp.value() && rp.value();
    
    }
    
     
    
    //利用全局函数重载||操作符
    
    bool operator || (const Test& lp, const Test& rp)
    
    {
    
        return lp.value() || rp.value();
    
    }
    
     
    
    Test func(Test i)
    
    {
    
        cout << "int func(Test i): i.value() = " << i.value() << endl;
    
        return i;
    
    }
    
     
    
    int main()
    {
    
        Test t0(0);
    
        Test t1(1);
    
       
    
        //输出:(分析:相当于函数调用,进入函数体,参数的值必须被计算出来)
    
        //int func(Test i): i.value() = 1
    
        //int func(Test i): i.value() = 0
    
        //Result: false
    
        //短路法则完全失效,重载&&改变了其原来应短路的语义
    
        if(func(t0) && func(t1)) //相当于函数调用operator&&(func(t0), func(t1))
    
        {
    
            cout << "Result: true" << endl;
    
        }
    
        else
    
        {
    
            cout << "Result: false" << endl;
    
        }
    
       
    
        cout << endl;
    
       
    
        //输出:(分析:相当于函数调用,进入函数体,参数的值必须被计算出来)
    
        //int func(Test i): i.value() = 1
    
        //int func(Test i): i.value() = 0
    
        //Result: true
    
        //短路法则完全失效,重载||改变了其原来应短路的语义
    
        if(func(t0) || func(t1)) //相当于函数调用operator&&(func(t0), func(t1))
    
        {
    
            cout << "Result: true" << endl;
    
        }
    
        else
    
        {
    
            cout << "Result: false" << endl;
    
        }
    
     
    
        return 0;
    
    }

    运行结果:

      

    3. 小结

    (1)C++语法上支持逻辑操作符重载

    (2)重载后的逻辑操作符不满足短路法则

    (3)工程开发中不要重载逻辑操作符

    (4)通过重载比较操作符替换逻辑操作符重载

    (5)通过专用成员函数替换逻辑操作符的重载

  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/hoiday/p/10166440.html
Copyright © 2011-2022 走看看