逻辑操作符陷阱
Posted 阿弥陀佛.a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑操作符陷阱相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int v)
{
mValue = v;
}
//为什么const修饰?因为下面的const对象只能调用const成员函数
//对象为了回去mValue的值,只能将这个成员函数定义为const
int value() const
{
return mValue;
}
};
bool operator && (const Test& l, const Test& r)
{
return l.value() && r.value();//与上面的注释呼应
}
bool operator || (const Test& l, const Test& r)
{
return l.value() || r.value();
}
Test func(Test i)
{
cout << "Test func(Test i) : i.value() = " << i.value() << endl;
return i;
}
int main()
{
Test t0(0);
Test t1(1);
//根据&&运算符的规则,如果前面是0,那么后面后面一个就不会去看了
//所以按道理只会打印Test func(Test i) : i.value() = 0
//Result is false!
//但是结果出乎意料,下面的或运算也是!为什么呢?
if( func(t0) && func(t1) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
cout << endl;
if( func(1) || func(0) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
return 0;
}
也可以写成:
if( func(t0).operator && ( func(t1) ) )
{
}
if( func(t0).operator || ( func(t1) ) )
{
}
操作符重载其实是函数,所以执行前会执行参数:func(t0),func(t1),函数参数调用次序是未知的
不推荐重载逻辑操作符!没有办法通过重载实现逻辑操作符的原生语义。
小结
以上是关于逻辑操作符陷阱的主要内容,如果未能解决你的问题,请参考以下文章