位运算符和逻辑运算符(C++,C#):与和逻辑与,非和逻辑非

本文详细解释了位运算符(&、|)与逻辑运算符(&&、||)的区别,并通过实例展示了它们在C++中的应用。特别是针对效率问题,介绍了短路逻辑运算的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/06/08/1498500.html
原文标题:位运算符和逻辑运算符(C++,C#):与和逻辑与,非和逻辑非
原文发表:2009/6/8 2:50:00

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

运行起来的效果如下

image

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

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

image

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

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

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

 

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

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

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

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

image

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

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

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

 

本例完整代码如下

#include
using namespace std;

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

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

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

作者:陈希章
出处:http://blog.youkuaiyun.com/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值