今天来学习C++中的逗号操作符。那么什么是逗号操作符呢?

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

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

    exp1,exp2,……,expn-1,expn

下面我们还是以一个例子来说明逗号表达式概念与性质:

#include <iostream>
#include <string>using namespace std;void func(int i)
{cout << "func() : i = " << i << endl;
}int main()
{int a[3][3]={(0,1,2),  //注意,这里的二维数组的初始化用的是(),而不是{},所以里面的内容构成逗号表达式(0,1,2)的值就为2.(3,4,5),  //(3,4,5)的值为5(6,7,8)   //(6,7,8)的值为8,所以这个数组实际上,只初始化了前三个数,后面的数全为0;};int i = 0;int j = 0;while(i < 5)func(i),  /*注意这里是逗号,而不是分号,所以这个表达式等同于{func(i);i++}*/i++;for(i=0;i<3;i++){for(j=0;j<3;j++){cout << a[i][j] << endl;}}(i,j) = 6;     //此处给逗号表达式赋值,实际上是给j赋值,而i值不变cout << "i = " << i << endl;cout << "j = " << j << endl;return 0;
}

上述程序运行结果为:
func() : i = 0
func() : i = 1
func() : i = 2
func() : i = 3
func() : i = 4
2
5
8
0
0
0
0
0
0
i = 3
j = 6

由运行结果,以及程序内容的分析,得以验证上面所说的逗号表达式的性质。

那么,我们来试一下逗号表达式的重载,看看会出现什么结果:

#include <iostream>
#include <string>using namespace std;class Test
{int mValue;
public:Test(int i){mValue = i;}int Value(){return mValue;}
};Test func(Test& i)
{cout << "func() : i = " << i.Value() << endl;return i;
}Test& operator , (const Test& a, const Test& b)  //重载逗号操作符
{return const_cast<Test&>(b);
}int main()
{Test t0(0);Test t1(1);Test tt = (func(t0),func(t1));cout << tt.Value() << endl;return 0;
}

运行结果:
func() : i = 1
func() : i = 0
1
由程序的分析,以及运行结果得知,我们的逗号操作符确实是返回的是最后一个子表达式的值,但是有一点,却变了,子表达式的运行的次序,可以看出,是先运行func(t1),后运行func(t0),这是为什么呢?

问题本质的分析:

  1. C++通过函数调用扩展操作符的功能
  2. 进入函数体前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 重载后无法严格按照从左向右的次序计算表达式(这跟编译器有关,也有可能会从左向右计算)

而当我们把上面的重载函数去掉,不用重载的逗号表达式,直接用原有的逗号表达式,结果就是:
func() : i = 0
func() : i = 1
1


总结:

  • 逗号表达式从左向右计算子表达式的值
  • 逗号表达式的值为最后一个子表达式的值
  • 操作符重载无法实现逗号操作符的原生语义
  • 工程开发中不要重载逗号操作符

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

【C++深度剖析教程18】逗号操作符的分析相关推荐

  1. 【C++深度剖析教程29】C++对象模型分析下

    加qq1126137994,微信:liu1126137994 一起学习更多技术!!! 今天来继续学习C++对象模型! 在C++编译器内部,类可以理解为结构体 子类是由父类成员叠加子类新成员得到的 下面 ...

  2. 【C++深度剖析教程28】C++对象模型分析

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天记录学习的内容是:C++对象模型分析!!! 本质分析: clas ...

  3. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  4. 【C++深度剖析教程19】前置操作符与后置操作符

    今天来学习C++中的前置操作符(++i)与后置操作符(i++). 一回顾 以前在C语言的理论课程中,我们就学过,前置和后置操作符,有一定的区别: 但是我们可以看到下图,发现前置和后置++的操作符所对应 ...

  5. 【C++深度剖析教程17】逻辑操作符的陷阱

    今天我们来学习逻辑操作符,那么什么是逻辑操作符的陷阱呢?在讲解逻辑操作符陷阱之前,我们先来回顾什么是逻辑操作符: 逻辑运算符的原生语义: -操作数只有两种值(true和false) -逻辑表达式不用完 ...

  6. 【C++深度剖析教程12】数组操作符的重载

    之前写的C++学习记录忘记打编号了,从今天开始,所有内容,记录编号,方便以后的查阅复习.今天学习的是C++中,数组操作符的重载. 上一篇博文写的是介绍C++中的字符串类,我们知道,C++标准库中通过s ...

  7. 【C++深度剖析教程8】C++的操作符重载的概念

    之前学习了类的函数重载的概念,今天学习操作符重载的概念.在这之前我们先看一个例子: 上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法.很显然,正常的+ ...

  8. 【C++深度剖析教程38】类模板深度剖析

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...

  9. 【C++深度剖析教程37】类模板的概念和意义

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...

最新文章

  1. 用js实现放大镜的效果
  2. 【Python-ML】SKlearn库网格搜索和交叉验证
  3. 常用的生物学数据库及网站介绍,你都了解了吗?
  4. php上传大文件500错误,PHP fastcgi模式大文件上传500错误
  5. 离职交接文档_离职程序员交接工作被同事怒怼:每一行代码都讲清楚,不然投诉你...
  6. SpringBoot2.1.5(11)---目录文件结构讲解
  7. maven打的包带exec包比不带的大_spring boot maven打包可执行jar包缺少依赖包的问题...
  8. wordpress 调用css,WordPress折腾记-精简CSS及JS在插件中的调用
  9. 《Java安全编码标准》一第 1 章 概  述
  10. sql语句如何获得当前日期
  11. Java---设计【员工工资管理系统】
  12. python基础:基础语法
  13. 小米路由器4a开发版固件_小米路由器4a刷第三方固件
  14. MOSS开发网站收集
  15. html火焰字效果,火焰字,通过PS的自带滤镜制作火焰效果文字
  16. 惠普HP DeskJet Ink Advantage 2777 驱动
  17. 华为android系统通知栏怎么关闭,华为通知栏怎么设置?三招帮你禁止华为通知栏消息...
  18. iOS开发中的零碎知识点笔记 韩俊强的博客
  19. centos7.2 下 ffmpeg交叉编译(安卓版x86_64)
  20. Spring整合JPA

热门文章

  1. 第五十九期:商用数据库之死:Oracle 面临困境
  2. 第三十二期:MySQL常见的图形化工具
  3. java学习(16):巩固练习
  4. 实例14:python
  5. Linux mount挂载和umont卸载U盘
  6. python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...
  7. UVA - 208 Firetruck(并查集+dfs)
  8. elasticsearch 问题
  9. Leetcode——300. 最长上升子序列
  10. 转:pysqlite笔记