当前位置: 首页 > wzjs >正文

360网站建设价位聊城网站建设哪家专业

360网站建设价位,聊城网站建设哪家专业,永久免费库存管理软件,百度快照优化排名怎么做4.5 递增和递减运算符 递增运算符()和递减运算符(–)为对象的加1和减1操作提供了一种简洁的书写形式。这两个运算符还可应用于迭代器,因为很多迭代器本身不支持算术运算,所以此时递增和递减运算符除了书写简洁外还是必须的。 递增和递减运算符有两种形式…

4.5 递增和递减运算符
递增运算符(++)和递减运算符(–)为对象的加1和减1操作提供了一种简洁的书写形式。这两个运算符还可应用于迭代器,因为很多迭代器本身不支持算术运算,所以此时递增和递减运算符除了书写简洁外还是必须的。
递增和递减运算符有两种形式:前置版本和后置版本。到目前为止,本书使用的都是前置版本,这种形式的运算符首先将运算对象加1(或减1),然后将改变后的对象作为求值结果。后置版本也会将运算对象加1(或减1),但是求值结果是运算对象改变之前那个值的副本:

int i=0,j;
j= ++i;//j=1,i=1:前置版本得到递增之后的值
j= i++; //j=1,i=2:后置版本得到递增之前的值

这两种运算符必须作用于左值运算对象。前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。
建议:除非必须,否则不用递增递减运算符的后置版本
有C语言背景的读者可能对优先使用前置版本递增运算符有所疑问,其实原因非常简单:前置版本的递增运算符避免了不必要的工作,它把值加1后直接返回改变了的运算对象。与之相比,后置版本需要将原始值存储下来以便于返回这个未修改的内容。如果我们不需要修改前的值,那么后置版本的操作就是一种浪费。
对于整数和指针类型来说,编译器可能对这种额外的工作进行一定的优化;但是对于相对复杂的迭代器类型,这种额外的工作就消耗巨大了。建议养成使用前置版本的习惯,这样不仅不需要担心性能的问题,而且更重要的是写出的代码会更符合编程的初衷。
在一条语句中混用解引用和递增运算符
如果我们想在一条复合表达式中既将变量加1或减1又能使用它原来的值,这时就可以使用递增和递减运算符的后置版本。
举个例子,可以使用后置的递增运算符来控制循环输出一个vector 对象内容直至遇到(但不包括)第一个负值为止:

auto pbeg=v.begin();
//输出元素直至遇到第一个负值为止
while(pbeg!=v.end()&&*pbeg>=0)
cout<<*pbeg++<<endl;//输出当前值并将pbeg 向前移动一个元素

对于刚接触C++和C的程序员来说,pbeg++不太容易理解。其实这种写法非常普遍所以程序员一定要理解其含义。
后置递增运算符的优先级高于解引用运算符,因此
pbeg++等价于*(pbeg++)。pbeg++把 pbeg 的值加1,然后返回 pbeg 的初始值的副本作为其求值结果,此时解引用运算符的运算对象是 pbeg 未增加之前的值。最终,这条语句输出pbeg开始时指向的那个元素,并将指针向前移动一个位置。
这种用法完全是基于一个事实,即后置递增运算符返回初始的未加1的值。如果返回的是加1之后的值,解引用该值将产生错误的结果。不但无法输出第一个元素,而且更糟糕的是如果序列中没有负值,程序将可能试图解引用一个根本不存在的元素。
建议:简洁可以成为一种美德
形如*pbeg++的表达式一开始可能不太容易理解,但其实这是一种被广泛使用的有效的写法。当对这种形式熟悉之后,书写

cout << *iter++<< endl;

要比书写下面的等价语句更简洁、也更少出错

cout << *iter<< endl;
++iter;

不断研究这样的例子直到对它们的含义一目了然。大多数C++程序追求简洁、摒弃冗长,因此 C++程序员应该习惯于这种写法。而且,一旦熟练掌握了这种写法后,程序出错的可能性也会降低。
运算对象可按任意顺序求值
大多数运算符都没有规定运算对象的求值顺序(参见4.1.3节,第123页),这在一般情况下不会有什么影响。然而,如果一条子表达式改变了某个运算对象的值,另一条子表达式又要使用该值的话,运算对象的求值顺序就很关键了。因为递增运算符和递减运算符会改变运算对象的值,所以要提防在复合表达式中错用这两个运算符。
为了说明这一问题,我们将重写3.4.1节(第97页)的程序,该程序使用for循环将输入的第一个单词改成大写形式:

for(auto it=s.begin();
it !=s.end()&& !isspace(*it); ++it)
*it = toupper(*it);//将当前字符改成大写形式

在上述程序中,我们把解引用it和递增it两项任务分开来完成。如果用一个看似等价的 while循环进行代替

//该循环的行为是未定义的!
while(beg!=s.end()&& !isspace(*beg))
*beg= toupper(*beg++);//错误:该赋值语句未定义

将产生未定义的行为。问题在于:赋值运算符左右两端的运算对象都用到了beg,并且右侧的运算对象还改变了 beg的值,所以该赋值语句是未定义的。编译器可能按照下面的任意一种思路处理该表达式:

*beg =toupper(*beg);//如果先求左侧的值
*(beg +1)= toupper(*beg);//如果先求右侧的值

也可能采取别的什么方式处理它。


文章转载自:

http://PUvijtCH.tbqbd.cn
http://KIkrtmUJ.tbqbd.cn
http://59poGcbV.tbqbd.cn
http://Yp47RNmm.tbqbd.cn
http://SumzGWXr.tbqbd.cn
http://RBkXmZnr.tbqbd.cn
http://IOMqipDC.tbqbd.cn
http://4Eggcrf2.tbqbd.cn
http://a6XBnBGl.tbqbd.cn
http://qfkpHRYa.tbqbd.cn
http://POmdtUf2.tbqbd.cn
http://mLWMTS5J.tbqbd.cn
http://OqJ49yhW.tbqbd.cn
http://jFABnHF7.tbqbd.cn
http://gkq56zfy.tbqbd.cn
http://IqvVcWUG.tbqbd.cn
http://PKqIx2qt.tbqbd.cn
http://CzoUaGDJ.tbqbd.cn
http://nXVaCRRP.tbqbd.cn
http://0BdEGBYI.tbqbd.cn
http://ScAhI5iu.tbqbd.cn
http://ZN3Nfyxm.tbqbd.cn
http://gK7hpm85.tbqbd.cn
http://WRxUDSFd.tbqbd.cn
http://rQ1Lzn4w.tbqbd.cn
http://Z7JIRWAO.tbqbd.cn
http://YD9aIlft.tbqbd.cn
http://bjfo3MLU.tbqbd.cn
http://oUXOGezy.tbqbd.cn
http://RT0fhogM.tbqbd.cn
http://www.dtcms.com/wzjs/655159.html

相关文章:

  • 模板网站建设多少钱沈阳网站关键词优化多少钱
  • 免费发布网站建设信息百度竞价推广账户优化
  • 做舞台灯光的在哪些网站接订单呢建网页服务公司
  • 江苏网站设计方案怎么查网站是哪个公司做的
  • 自己做网站主机网站建设介绍语
  • 网页设计和网站建设的课程设计广西建设厅证书查询
  • 灌云县建设局网站网站后台管理系统 源码
  • 网站建设基本流程心得搜索引擎营销的主要方式有哪些?
  • 刘涛给孩子网站做的广告网站建设方案书 人员资金安排
  • 网站推广文章范例如何创立一个网站
  • 卓进网站做多语言网站不会翻译怎么办
  • 有企业信息的网站360网站提交收录入口
  • 太原这边有做网站的吗湖南省网站备案登记
  • 软件做网站 编程自己写wordpress 主题域名授权
  • ui界面设计培训班谷歌排名优化入门教程
  • 很多搜索词网站怎样做谷歌广告平台
  • 给网站网站做推广犯法跨国采购网外贸论坛
  • 网站建设自助建站企业一般注册公司要多少钱
  • 综合购物网站建站商机互联网站建设
  • 官方网站建设必要性如何改变wordpress字体颜色
  • 购买手表网站东营住房和城乡建设厅官网
  • 如何自己做众筹网站网站行业认证怎么做
  • 四川成都最新消息台州网站优化方案
  • 专业建设验收网站英国做网站的人
  • 太原网站制作案例乐清比较好的设计公司
  • 温州网站制作设计建设厅官方网站河南
  • 虹口上海网站建设在线设计平台源码
  • 公司网站备案号织梦网站做seo优化
  • 做网站的费用记哪个会计科目强强seo博客
  • 网站代理维护seo网站搭建