news 2026/4/28 14:32:18

C++超详细讲解逻辑操作符

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++超详细讲解逻辑操作符

一、逻辑运算符的原生语义

  1. 操作数只有两种值( true和 false )逻
  2. 辑表达式不用完全计算就能确定最终值
  3. 最终结果只能是 true 或者 false

下面看一个逻辑表达式的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#include <iostream>

#include <string>

usingnamespacestd;

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;

}

输出结果如下:

这就是逻辑操作符的短路规则,可以参照我之前写的详细讲解逻辑运算符的使用

二、重载逻辑操作符

逻辑操作符可以重载吗?重载逻辑操作符有什么意义?

下面看一个重载逻辑操作符示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

#include <iostream>

usingnamespacestd;

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) 运行后的值,这是为什么呢?且看下面解析。

问题的本质分析

  1. C++ 通过函数调用扩展操作符的功能
  2. 进入函数体前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 短路法则完全失效

逻辑操作符重载后无法完全实现原生的语义。

上述代码等效写法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

#include <iostream>

usingnamespacestd;

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++ 从语法上支持逻辑操作符重载
  • 重载后的逻辑操作符不满足短路法则
  • 工程开发中不要重载逻辑操作符
  • 通过重载比较操作符替换逻辑操作符重载
  • 通过专用成员函数替换逻辑操作符重载
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 14:32:17

GHelper三分钟搞定:华硕笔记本性能调优零基础入门指南

GHelper三分钟搞定&#xff1a;华硕笔记本性能调优零基础入门指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…

作者头像 李华
网站建设 2026/4/28 14:32:14

5个关键点解析FAST-LIVO:如何实现激光视觉惯导的高效紧耦合

5个关键点解析FAST-LIVO&#xff1a;如何实现激光视觉惯导的高效紧耦合 【免费下载链接】FAST-LIVO A Fast and Tightly-coupled Sparse-Direct LiDAR-Inertial-Visual Odometry (LIVO). 项目地址: https://gitcode.com/gh_mirrors/fa/FAST-LIVO FAST-LIVO是一款创新的激…

作者头像 李华
网站建设 2026/4/28 14:31:15

Agent基础知识点

1、rag和mcp想让大模型读本地私有资料、不幻觉&#xff1a;用 RAG想统一对接多个知识库、数据库、不用重复写接口&#xff1a;用 MCP2、agent skill和系统提示词应对越来越多的特定系统提示词&#xff0c;出现了agent skill

作者头像 李华
网站建设 2026/4/28 14:31:14

LLM聊天机器人能耗优化与可持续交互设计

1. LLM聊天机器人交互设计的可持续性挑战大型语言模型(LLM)聊天机器人已成为现代数字交互的核心界面&#xff0c;从代码辅助到教育辅导&#xff0c;其应用场景不断扩展。然而&#xff0c;这种技术便利背后隐藏着不容忽视的能源消耗问题。根据最新研究&#xff0c;一个中等规模的…

作者头像 李华
网站建设 2026/4/28 14:30:43

30秒学会AI视频插帧:Flowframes让你的视频秒变120帧超流畅

30秒学会AI视频插帧&#xff1a;Flowframes让你的视频秒变120帧超流畅 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframes 想让普通视频瞬间…

作者头像 李华
网站建设 2026/4/28 14:28:58

告别MobileNet?手把手教你用MobileViT在iPhone上跑图像分类(附完整代码)

MobileViT实战指南&#xff1a;在iPhone上实现高效图像分类的完整方案 1. 移动端视觉模型的演进与选择 移动设备上的计算机视觉应用正经历着从传统CNN到混合架构的转型。过去五年里&#xff0c;我们看到MobileNet系列主导了移动端视觉任务&#xff0c;其深度可分离卷积的设计理…

作者头像 李华