C++超详细讲解逻辑操作符
一、逻辑运算符的原生语义操作数只有两种值( true和 false )逻辑表达式不用完全计算就能确定最终值最终结果只能是 true 或者 false下面看一个逻辑表达式的代码1234567891011121314151617181920212223242526272829#include iostream#include stringusingnamespacestd;intfunc(inti){cout int func(int i): i i endl;returni;}intmain(){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;}return0;}输出结果如下这就是逻辑操作符的短路规则可以参照我之前写的详细讲解逻辑运算符的使用二、重载逻辑操作符逻辑操作符可以重载吗重载逻辑操作符有什么意义下面看一个重载逻辑操作符示例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include iostreamusingnamespacestd;classTest{intmValue;public:Test(intv){mValue v;}intvalue()const{returnmValue;}};booloperator (constTest l,constTest r){returnl.value() r.value();}booloperator ||(constTest l,constTest r){returnl.value() || r.value();}Test func(Test i){cout Test func(Test i): i.value() i.value() endl;returni;}intmain(){Test t0(0);Test t1(1);if(func(t0) func(t1)){cout Result is true! endl;}else{cout Result is false! endl;}cout endl;if(func(t0) || func(t1)){cout Result is true! endl;}else{cout Result is false! endl;}}输出结果如下按照短路法则func(t0) func(t1) 应该只执行 func(t0)这里却输出了func(t0) 和 func(t1) 运行后的值这是为什么呢且看下面解析。问题的本质分析C 通过函数调用扩展操作符的功能进入函数体前必须完成所有参数的计算函数参数的计算次序是不定的短路法则完全失效逻辑操作符重载后无法完全实现原生的语义。上述代码等效写法如下1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include iostreamusingnamespacestd;classTest{intmValue;public:Test(intv){mValue v;}intvalue()const{returnmValue;}};booloperator (constTest l,constTest r){returnl.value() r.value();}booloperator ||(constTest l,constTest r){returnl.value() || r.value();}Test func(Test i){cout Test func(Test i): i.value() i.value() endl;returni;}intmain(){Test t0(0);Test t1(1);if(operator (func(t0), func(t1))){cout Result is true! endl;}else{cout Result is false! endl;}cout endl;if(operator || (func(t0), func(t1))){cout Result is true! endl;}else{cout Result is false! endl;}}输出结果和上面一样将func(t0) func(t1) 改写成operator (func(t0), func(t1))就不难理解为什么了。核心就两点1.进入函数体前必须完成所有参数的计算2.函数参数的计算次序是不定的一些有用的建议实际工程开发中避免重载逻辑操作符通过重载比较操作符代替逻辑操作符重载直接使用成员函数代替逻辑操作符重载使用全局函数对逻辑操作符进行重载三、小结C 从语法上支持逻辑操作符重载重载后的逻辑操作符不满足短路法则工程开发中不要重载逻辑操作符通过重载比较操作符替换逻辑操作符重载通过专用成员函数替换逻辑操作符重载