逻辑操作符的陷阱

Posted chengeputongren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑操作符的陷阱相关的知识,希望对你有一定的参考价值。

  • 逻辑运算符的原生语义
  1. 操作数只有两种值(true和false)
  2. 逻辑表达式不用完全计算就能确定最终值
  3. 最终结果只能是true或者false
那么,如果我们重载逻辑运算符会发生什么?
例:
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Test
 5 {
 6     int value;
 7 public:
 8     Test(int _value)
 9     {
10         this->value = _value;
11     }
12     ~Test()
13     {
14     }
15     int get_value()
16     {
17         return this->value;
18     }
19 };
20 //重载逻辑与操作符
21 bool operator && (Test op1,Test op2)
22 {
23     return op1.get_value() && op2.get_value();
24 }
25 //重载逻辑或操作符
26 bool operator || (Test op1,Test op2)
27 {
28     return op1.get_value() || op2.get_value();
29 }
30 Test func(Test t)
31 {
32     cout << "Test func(Test t) : Test.value = " << t.get_value() << endl ;
33     
34     return t;
35 }
36 int main()
37 {
38     Test t0(0);
39     Test t1(1);
40 #if 0
41     if (func(t0) && func(t1))
42     {
43        cout << "The result is true" << endl;
44     }
45     else
46     {
47         cout << "The result is false" << endl;
48     }
49 #endif
50     if (operator &&(func(t0),func(t1)))
51     {
52         cout << "The result is true" << endl;
53     }
54     else
55     {
56         cout << "The result is false" << endl;
57     }
58 }

运行结果:

Test func(Test t) : Test.value = 1
Test func(Test t) : Test.value = 0
The result is false
  • 问题的本质分析
  1. C++通过函数调用扩展操作符的功能
  2. 进入函数前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 短路法则完全失效
如果重载逻辑操作符,逻辑操作符重载后无法完全实现原生的语义!!
  • 一些建议
  1. 在实际工程中避免重载逻辑操作符
  2. 通过重载比较操作符代替逻辑操作符
  3. 直接使用成员函数代替逻辑操作符重载
  4. 使用全局函数对逻辑操作符进行重载
  • 小结
  1. C++从语义上支持逻辑操作符重载
  2. 重载后的逻辑操作符不满足短路法则
  3. 工程开发中不要重载逻辑操作符
  4. 通过重载比较操作符替换逻辑操作符重载
  5. 通过专用成员函数替换逻辑操作符重载
 
 
 
 
 

以上是关于逻辑操作符的陷阱的主要内容,如果未能解决你的问题,请参考以下文章

逻辑操作符的陷阱(三十二)

逻辑操作符陷阱

Intel 移位指令的陷阱(转)

逻辑陷阱型蜜罐合约

JS && || 陷阱 javascript 逻辑与逻辑或

搞懂富人的内在逻辑|普通人如何改变命运?财富02