zoukankan      html  css  js  c++  java
  • 位运算符和逻辑运算符(C++,C#):与和逻辑与,非和逻辑非

    为什么需要说这个话题呢?因为很多朋友搞不大清楚他们的区别。

    • 与运算,在编程中表示为&
    • 非运算,在编程中表示为|
    • 逻辑与运算:在编程中表示为&&
    • 逻辑非运算:在编程中表示为||

    前面两个是所谓的位运算符,后面两个是所谓的逻辑运算符

    与运算和逻辑与运算的规则是:

    • 运算符左右两个操作数都为true(1),才为true(1)。否则为false(0)

    非运算和逻辑非运算的规则是:

    • 运算符左右两个操作数只要有任何一个为false(0),就为false(0),否则就为true(1)

    那么,他们到底有什么区别呢?我们还是用一个例子来说明吧,例如

    我们需要计算两个函数的返回值运算的结果

    bool Method1(){
        cout<<"方法1被调用了"<<endl;
        return true;
    }

    bool Method2()
    {
        cout<<"方法2被调用了"<<endl;
        return true;
    }

    我们要对这两个方法的返回值进行与运算。

    int main()
    {
        if(Method1() & Method2())
            cout<<"两个方法都返回了true"<<endl;
        return 0;
    }

    运行起来的效果如下

    image

    很简单,对吧?我们现在把Method1的返回值改为false

    bool Method1(){
        cout<<"方法1被调用了"<<endl;
        return false;
    }

    image

    因为Method1返回了false,所以if(Method1() & Method2()) 返回了false,所以下面这一句是不会被执行的

    cout<<"两个方法都返回了true"<<endl;

    这是我们预期的结果,看起来没有什么问题嘛

    但是,我们发现即便Method1是false了,但Method2也还是被调用了。但我们知道,因为Method1已经返回了false,所以不管Method2无论是返回true还是false,那么结果都将是false.那么,这样的话,Method2再进行运算就没有任何意义。假设Method2的代码很复杂,则更加是不符合成本的考虑的。

    那么,如何解决这个问题呢?

    int main()
    {
        if(Method1() && Method2())
            cout<<"两个方法都返回了true"<<endl;
        return 0;
    }

    这样的话,返回的结果就是

    image

    你会发现,现在只是调用了Method1。而根本没有调用Method2

    所以,我们总结一下,虽然位运算符也可以做类似于逻辑运算的功能,但其实它并不是,它还是专门用于二进制里面的位运算吧。所有进行逻辑运算的情况,都应该使用逻辑运算符。

    这个特性在C#里面是一模一样的。但有一点要注意:在C#里面,bool值与整数型是不能转换的,这就更加严格地要求我们遵循上面的原则。

    本例完整代码如下

    #include <iostream>
    using namespace std;

    bool Method1(){
        cout<<"方法1被调用了"<<endl;
        return false;
    }

    bool Method2()
    {
        cout<<"方法2被调用了"<<endl;
        return true;
    }

    int main()
    {
        if(Method1() && Method2())
            cout<<"两个方法都返回了true"<<endl;
        return 0;
    }

  • 相关阅读:
    【C++ OpenGL ES 2.0编程笔记】8: 使用VBO和IBO绘制立方体 【转】
    顶点缓存对象(VBO)【转】
    CompileGLShader
    VR虚拟现实的工作原理,你知道多少?【转】
    VR/AR工作原理、目前存在的技术问题
    Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
    nginx配置用户认证
    恢复阿里云RDS云数据库MySQL的备份文件到自建数据库
    阿里云rds linux平台使用wget 工具下载备份与日志文件
    screen 命令使用及示例
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1498500.html
Copyright © 2011-2022 走看看