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;
    }

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1498500.html
Copyright © 2011-2022 走看看