文章内容来源于狄泰软件学院唐老师C++课程课件。
一、潜规则
- 操作数只有两种值(true和false)
- 逻辑表达式不用完全计算就能确定最终值
- 最终结果只能是true或者是false
二、
#include<iostream>
#include<string>
using namespace std;
int func(int i)
{
cout<<"int func(int i):i== "<<i<<endl;
}
int main()
{
if(func(0)&&func(1))
{
cout<<"Result is true"<<endl;
}
else
{
cout<<"Result is false"<<endl;
}
cout<<endl;
if(func(0)||func(1))
{
cout<<"Result is true"<<endl;
}
else
{
cout<<"Result is false"<<endl;
}
}
int func(int i):i== 0
Result is false
int func(int i):i== 0
int func(int i):i== 1
Result is true
三、逻辑操作符可以重载吗?重载逻辑操作符有什么意义?
#include<iostream>
#include<string>
using namespace std;
class Test
{
int mValue;
public:
Test(int v)
{
mValue=v;
}
int value() const//bei const diaoyong
{
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== "<<i.value()<<endl;
return i;
}
int main()
{
Test t0(0);
Test t1(1);
if(func(t0)&&func(t1))
{
cout<<"Result is true"<<endl;
}
else
{
cout<<"Result is false"<<endl;
}
cout<<endl;
cout<<endl;
if(func(t0)||func(t1))
{
cout<<"Result is true"<<endl;
}
else
{
cout<<"Result is false"<<endl;
}
cout<<endl;
}
Test func(Test i):i== 1
Test func(Test i):i== 0
Result is false
Test func(Test i):i== 1
Test func(Test i):i== 0
Result is true
结果:
&& 和||都被调用了两次,且先调用t1,这与我们所理解的不一样
四、问题的本质
- C++通过函数调用扩展操作符的功能
- 进入函数体前必须完成所有参赛的计算
- 参数的计算次序是不定的
- 短路法则完全失效
换成函数调用的方式:
if(opertator &&(func(t0)&&func(t1))),函数调用,则进入函数调用之前,参数需要确定。
五、一些有用的建议
- 实际工程开发中避免重载逻辑操作符
- 通过重载比较操作符代替逻辑操作符重载
- 直接使用成员函数代替逻辑操作符重载
- 使用全局函数对逻辑操作符进行重载