博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作数有自增操作时复合表达式的陷阱
阅读量:6281 次
发布时间:2019-06-22

本文共 1640 字,大约阅读时间需要 5 分钟。

2013-08-02 13:58:59

 最近看C++primer,发现一些细节,一直没搞清楚。

5.5节 自增与自减操作符

++为自增,--为自减,这两种操作符都分别有前置与后置来两种形式,要搞清楚两种形式的差别。下面以自增操作符为例进行说明。

前自增操作符是操作数加1,操作结果是修改后的值,返回的是对象本身,是左值

后自增操作符同样对齐操作数加1,但是操作后产生操作数原来的,未经修改的值作为表达式的结果,返回的是右值

测试如下:

测试1:

测试后自增结果作为左值

(*ptr)++ += 10;

因为(*ptr)++返回值为左值,

编译报错:left operand must be l-value

//测试表达复合式void TestCompoundAssignment(){    int a[5]= {
1,2,3,4,5}; DisplayArray(a,5); int *ptr = a; (*ptr)++ += 10; //(*ptr)++返回值为左值,报错:left operand must be l-value cout<<*ptr<

测试2

测试前自增结果作为左值:

++(*ptr) += 10;

等价于:

++(*ptr);

*ptr += 10;

//测试表达复合式void TestCompoundAssignment(){    int a[5]= {
1,2,3,4,5}; DisplayArray(a,5); int *ptr = a; ++(*ptr) += 10; //(*ptr)++返回值为左值,报错:left operand must be l-value cout<<*ptr<

 运行结果:

1       2       3       4       51212      2       3       4       5请按任意键继续. . .

 

 


 

C++primer 5.10 节讲到复合表达式求值,提到“一个表达式里不要在一个或更多的子表达式中对同一个对象做自增或自减操作”,因为其求值顺序不易把握,容易出错,下面给出了复合表达式中使用自增操作的例子,求值的顺序并不是每个人都能够正确把握的。

下面是测试代码:

测试1:

*ptr++ += 10;

等价于:

*ptr += 10;

 ptr++;

void TestCompoundAssignment(){    int a[5]= {
1,2,3,4,5}; DisplayArray(a,5); int *ptr = a; *ptr++ += 10; //等价于 /**ptr += 10; ptr++;*/ cout<<*ptr<

运行结果:

1       2       3       4       5211      2       3       4       5请按任意键继续. . .

 

测试2:

*ptr++ = *ptr++ + 10;

等价于:

*ptr += 10;

 ptr++;
 ptr++;

//测试表达复合式void TestCompoundAssignment(){    int a[5]= {
1,2,3,4,5}; DisplayArray(a,5); int *ptr = a; *ptr++ = *ptr++ + 10; //在同一个语句中对同一对象做自增,结果与操作数的次序有关, //等价于 /**ptr += 10; ptr++; ptr++;*/ cout<<*ptr<

运行结果:

1       2       3       4       5311      2       3       4       5请按任意键继续. . .

 

转载地址:http://uuxva.baihongyu.com/

你可能感兴趣的文章
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
存储过程加密
查看>>
[再寄小读者之数学篇] (2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]一个秩等式)...
查看>>
hrbustoj 1179:下山(DFS+剪枝)
查看>>
DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
查看>>
MongoDB-固定集合 capped collection 操作 介绍
查看>>
npoi实现 从固定的行读取数据作为表头并返回datable
查看>>
【Hibernate学习】 ——ORM(三)
查看>>
概率dp入门
查看>>
dotfuscator初步
查看>>
Ubuntu各个版本的介绍
查看>>
【leetcode】Pascal's Triangle I & II (middle)
查看>>
SQL Server
查看>>