当前位置: 首页 > news >正文

C++超详细讲解逗号操作符

一、逗号操作符

逗号操符( , )可以构成逗号表达式

  • 逗号表达式用于将多个子表达式连接为一个表达式
  • 逗号表达式的值为最后一个子表达式的值
  • 逗号表达式中的前 N-1 个子表达式可以没有返回值
  • 逗号表达式按照从左向右的顺序计算每个子表达式的值

下面看一个逗号表达式的示例:

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

#include <iostream>

usingnamespacestd;

voidfunc(inti)

{

cout <<"func(): i = "<< i << endl;

}

intmain()

{

inta[3][3] = {

(0, 1, 2),

(3, 4, 5),

(6, 7, 8)

};

inti = 0;

intj = 0;

while(i < 5)

func(i),

i++;

for(i = 0; i < 3; i++)

{

for(j = 0; j < 3; j++)

{

cout << a[i][j] << endl;

}

}

(i, j) = 6;

cout <<"i = "<< i << endl;

cout <<"j = "<< j << endl;

return0;

}

输出结果如下:

注意三点:

1.使用括号,就不是初始化的方式,就变成了逗号表达式。要想其变成真正的初始化语句,需要把圆括号改成花括号。即

1

2

3

4

5

inta[3][3] = {

{0, 1, 2},

{3, 4, 5},

{6, 7, 8}

};

2.这个

1

2

3

while(i < 5)

func(i),

i++;

等价于

1

2

3

4

5

while(i < 5)

{

func(i);

i++;

}

3.(i, j) = 6; 按照逗号表达式的规则,就是等价于 j = 6;

二、重载逗号操作符

  • 在C++ 中重载逗号操作符是合法的
  • 使用全局函数对逗号操作符进行重载
  • 重载函数的参数必须有一个是类类型
  • 重载函数的返回值类型必须是引用

下面来尝试一下重载逗号操作符:

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

#include <iostream>

usingnamespacestd;

classTest

{

intmValue;

public:

Test(inti)

{

mValue = i;

}

intvalue()

{

returnmValue;

}

};

Test& operator , (constTest& a,constTest& b)

{

returnconst_cast<Test&>(b);

}

Test func(Test& i)

{

cout <<"func(): i = "<< i.value() << endl;

returni;

}

intmain()

{

Test t0(0);

Test t1(1);

Test tt = (func(t0), func(t1));

cout << tt.value() << endl;

return0;

}

输出结果如下:

其中

1

Test tt = (func(t0), func(t1));

等价于:

1

Test tt = (operator , (func(t0), func(t1)));

问题的本质分析

  • C++ 通过函数调用扩展操作符的功能
  • 进入函数体前必须完成所有参数的计算
  • 函数参数的计算次序是不定的
  • 重载后无法严格从左向右计算表达式

可以看一下不重载会输出什么,把下面这段注释掉。

1

2

3

4

Test& operator , (constTest& a,constTest& b)

{

returnconst_cast<Test&>(b);

}

输出如下:

可以看到不重载逗号操作符是按照从左到右执行,重载后反而不正常了,所以逗号操作符没有重载的必要。注意事项:工程中不要重载逗号操作符!!!

http://www.jsqmd.com/news/713266/

相关文章:

  • 离线思维整理革命:为什么DesktopNaotu是你的跨平台脑图终极解决方案
  • 如何用The Super Tiny Compiler实现循环结构编译:从入门到精通的完整指南
  • 为什么92%的团队在Copilot Next工作流中埋下供应链攻击入口?——揭秘3类隐蔽式prompt注入路径与实时防御DSL配置
  • 从0到1部署算法可视化平台:AWS ECS/EKS云原生终极指南
  • 终极Android手势识别开发指南:从入门到精通的视觉交互技术
  • 完整指南:如何使用GEMMA高效完成基因组关联分析
  • Qt软键盘中文输入实战:手把手教你用PinYin_Chinese.txt文件实现拼音转汉字
  • NVIDIA Kaolin库中的弹性物体模拟技术解析
  • Phi-4-mini-reasoning轻量模型部署成本分析:单卡月均电费与推理QPS性价比
  • 3分钟快速上手:免费GitHub加速插件终极安装指南
  • 佛山哪里有 5A 级有声语言艺术培训机构 - 中媒介
  • Nuclei超强漏洞扫描引擎:如何实现千倍性能提升的安全检测革命
  • 终极指南:如何用n与Corepack实现无缝Node.js版本管理
  • 3步解锁完整视觉体验:UniversalUnityDemosaics去马赛克插件完全指南
  • ComfyUI-Easy-Use提示词选择器性能优化终极指南:如何从卡顿到流畅的完整解决方案
  • 探索SMUDebugTool:AMD Ryzen硬件调试技术深度解析
  • 600面值的微信立减金套装回收:这样最划算,过期前还能轻松变现 - 畅回收小程序
  • 告别文档大海捞针:Cloudreve API文档搜索快捷键终极指南
  • React应用稳定性革命:7个关键业务指标监控实战技巧
  • baidupankey技术深度|架构解析|实战指南:从效率工具到技术哲学的重构
  • 开源项目的法律边界:从技术探索到合规运营的终极指南
  • Android Studio中文界面实战指南:社区驱动的本地化解决方案
  • 从数据洪流到精准洞察:Kafka流处理窗口计算与状态管理终极指南
  • 终极指南:如何用Nuclei自包含模板彻底告别依赖地狱
  • 5分钟快速上手:Reloaded-II .NET Core游戏模组加载器终极指南
  • 2026年青岛肖像写真行业选型指南 - 速递信息
  • 详解C++赋值操作符重载
  • 用ESP32C3+Arduino IDE,5分钟搞定MiniMax大模型对话机器人(附完整代码)
  • 如何使用PostCSS优化字体加载性能:提升网页加载速度的完整指南
  • 7个元数据字段掌控AI代理行为:Semantic Kernel配置实战指南