博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自增和自减操作符
阅读量:6259 次
发布时间:2019-06-22

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

毫无疑问,自增( ++ )和自减( -- )操作符为对象加1或减1操作提供了方便简短的实现方式。(编程中的宗旨“简洁即美”!)

它们有前置和后置两种使用形式:
  int i = 0, j;
     j = ++i;  // j = 1, i = 1: prefix yields incremented value
     j = i++;  // j = 1, i = 2: postfix yields unincremented value

因为前置操作返回加1后的值,所以返回对象本身,是左值。而后置操作返回的则是右值

( 巧记:“前前后后”—— 前置操作返回修改前的值,后置操作返回修改后的值 )。

建议:优先使用前自增操符,只有在必要时才使用后置操作符
Why ?
因为前置操作需要做的工作更少,只需加 1 后返回加 1 后的结果即可。
而后置操作符则必须先保存操作数原来的值,以便返回未加 1 之前的值作为操作的结果。
对于 int 型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。
因此,养成使用前置操作这个好习惯,就不必操心性能差异的问题。

常常会见到一些在单个表达式中组合使用解引用和自增的操作,举例如下:

1      vector
ivec; // empty vector 2 int cnt = 10; 3 // add elements 10 9 8...1 to ivec 4 while (cnt > 0) 5     ivec.push_back(cnt--); // int postfix decrement 6 7 vector
::iterator iter = ivec.begin(); 8 // prints 10 9 8 ... 1 9   while (iter != ivec.end())10     cout << *iter++ << endl; // iterator postfix increment

 

由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于 *(iter++)。

子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达式的结果。
因此,解引用操作 * 的操作数是 iter 未加 1 前的副本。
此例如果使用后置自加,则返回的是加 1 后的值,解引用该值将导致错误的结果:
ivec 的首个元素没有输出,并企图对一个结尾之后的多余元素进行解引用。(此例就是“必要时”的情况)

 

 

转载于:https://www.cnblogs.com/yshl-dragon/archive/2013/03/21/2972978.html

你可能感兴趣的文章
顺序图【6】--☆☆
查看>>
Docker Swarm 让你事半功倍
查看>>
javaScript事件(四)event的公共成员(属性和方法)
查看>>
Oracle SID爆破工具SidGuess
查看>>
批处理常用命令总结2
查看>>
Android -- 自定义View小Demo,绘制钟表时间(一)
查看>>
信息检索Reading List
查看>>
自动精简配置&重复数据删除核心技术点及其经济效应探究
查看>>
cncert网络安全周报35期 境内被植入后门的政府网站112个 环比上涨24.4%
查看>>
物联网到底是不是泡沫,且看英特尔交出的答案
查看>>
IPv6太落后了:中国加速服务器援建
查看>>
物理引擎中velocity的单位是个什么鬼?
查看>>
oracle的drop命令
查看>>
设计与梳理企业二级流程的路线方法
查看>>
垃圾回收概念与算法
查看>>
TFS实现需求工作项自动级联保存
查看>>
springmvc 4.x 处理json 数据时中文乱码
查看>>
Python练习(day7)
查看>>
网络工程师笔试题总结
查看>>
飞舞的蝴蝶
查看>>