【C++深度剖析教程18】逗号操作符的分析
今天来学习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),这是为什么呢?
问题本质的分析:
- C++通过函数调用扩展操作符的功能
- 进入函数体前必须完成所有参数的计算
- 函数参数的计算次序是不定的
- 重载后无法严格按照从左向右的次序计算表达式(这跟编译器有关,也有可能会从左向右计算)
而当我们把上面的重载函数去掉,不用重载的逗号表达式,直接用原有的逗号表达式,结果就是:
func() : i = 0
func() : i = 1
1
总结:
- 逗号表达式从左向右计算子表达式的值
- 逗号表达式的值为最后一个子表达式的值
- 操作符重载无法实现逗号操作符的原生语义
- 工程开发中不要重载逗号操作符
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
【C++深度剖析教程18】逗号操作符的分析相关推荐
- 【C++深度剖析教程29】C++对象模型分析下
加qq1126137994,微信:liu1126137994 一起学习更多技术!!! 今天来继续学习C++对象模型! 在C++编译器内部,类可以理解为结构体 子类是由父类成员叠加子类新成员得到的 下面 ...
- 【C++深度剖析教程28】C++对象模型分析
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天记录学习的内容是:C++对象模型分析!!! 本质分析: clas ...
- 【C++深度剖析教程39】实现C++数组类模板
上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...
- 【C++深度剖析教程19】前置操作符与后置操作符
今天来学习C++中的前置操作符(++i)与后置操作符(i++). 一回顾 以前在C语言的理论课程中,我们就学过,前置和后置操作符,有一定的区别: 但是我们可以看到下图,发现前置和后置++的操作符所对应 ...
- 【C++深度剖析教程17】逻辑操作符的陷阱
今天我们来学习逻辑操作符,那么什么是逻辑操作符的陷阱呢?在讲解逻辑操作符陷阱之前,我们先来回顾什么是逻辑操作符: 逻辑运算符的原生语义: -操作数只有两种值(true和false) -逻辑表达式不用完 ...
- 【C++深度剖析教程12】数组操作符的重载
之前写的C++学习记录忘记打编号了,从今天开始,所有内容,记录编号,方便以后的查阅复习.今天学习的是C++中,数组操作符的重载. 上一篇博文写的是介绍C++中的字符串类,我们知道,C++标准库中通过s ...
- 【C++深度剖析教程8】C++的操作符重载的概念
之前学习了类的函数重载的概念,今天学习操作符重载的概念.在这之前我们先看一个例子: 上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法.很显然,正常的+ ...
- 【C++深度剖析教程38】类模板深度剖析
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...
- 【C++深度剖析教程37】类模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...
最新文章
- 用js实现放大镜的效果
- 【Python-ML】SKlearn库网格搜索和交叉验证
- 常用的生物学数据库及网站介绍,你都了解了吗?
- php上传大文件500错误,PHP fastcgi模式大文件上传500错误
- 离职交接文档_离职程序员交接工作被同事怒怼:每一行代码都讲清楚,不然投诉你...
- SpringBoot2.1.5(11)---目录文件结构讲解
- maven打的包带exec包比不带的大_spring boot maven打包可执行jar包缺少依赖包的问题...
- wordpress 调用css,WordPress折腾记-精简CSS及JS在插件中的调用
- 《Java安全编码标准》一第 1 章 概 述
- sql语句如何获得当前日期
- Java---设计【员工工资管理系统】
- python基础:基础语法
- 小米路由器4a开发版固件_小米路由器4a刷第三方固件
- MOSS开发网站收集
- html火焰字效果,火焰字,通过PS的自带滤镜制作火焰效果文字
- 惠普HP DeskJet Ink Advantage 2777 驱动
- 华为android系统通知栏怎么关闭,华为通知栏怎么设置?三招帮你禁止华为通知栏消息...
- iOS开发中的零碎知识点笔记 韩俊强的博客
- centos7.2 下 ffmpeg交叉编译(安卓版x86_64)
- Spring整合JPA