该篇文章是我于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;
}
运行起来的效果如下
很简单,对吧?我们现在把Method1的返回值改为false
bool Method1(){
cout<<"方法1被调用了"<
return false;
}
因为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;
}
这样的话,返回的结果就是
你会发现,现在只是调用了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 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |