news 2026/4/28 9:50:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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);

}

输出如下:

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 9:50:32

终极指南:Consul速率限制如何保护分布式系统API流量与防滥用

终极指南&#xff1a;Consul速率限制如何保护分布式系统API流量与防滥用 【免费下载链接】consul Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure. 项目地址…

作者头像 李华
网站建设 2026/4/28 9:49:07

ArchivePasswordTestTool:基于7zip引擎的高效压缩包密码恢复解决方案

ArchivePasswordTestTool&#xff1a;基于7zip引擎的高效压缩包密码恢复解决方案 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 在数据安全…

作者头像 李华
网站建设 2026/4/28 9:47:29

如何在Yew应用中集成Stripe和PayPal支付:完整指南

如何在Yew应用中集成Stripe和PayPal支付&#xff1a;完整指南 【免费下载链接】yew Rust / Wasm framework for creating reliable and efficient web applications 项目地址: https://gitcode.com/gh_mirrors/ye/yew Yew是一个基于Rust和WebAssembly的现代Web框架&…

作者头像 李华
网站建设 2026/4/28 9:46:29

Consul最佳实践:生产环境部署与运维的10个关键经验

Consul最佳实践&#xff1a;生产环境部署与运维的10个关键经验 【免费下载链接】consul Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure. 项目地址: https:…

作者头像 李华