前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/CPP前置后置递增运算符原理与复杂组合运算

C/CPP前置后置递增运算符原理与复杂组合运算

作者头像
CtrlX
发布2022-10-04 17:11:48
5070
发布2022-10-04 17:11:48
举报
文章被收录于专栏:C++核心编程C++核心编程

复杂的递增运算符组合运算

image
image

关键:

  1. 前加后加操作都是函数调用,他们都有返回值
  2. 后加的返回值是自加前的i值,可以认为它是一个常量
  3. 前加的返回值不是一个具体的数,而是变量的i的引用(指针),所以它的值会滞后到做加减运算的时候才能确定。

例题:

简单例题:

image
image
image
image
image
image

难度例题:

image
image
image
image

无论多么复杂的++组合运算,其实语法逻辑都很简单,都是:从左往右的函数调用和加法计算。

优先级问题

递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。

注意:

递增运算符和递减运算符只能影响一个变量(或者说只能影响一个可修改的左值)(详见C Primer Plus P118) 在C语言中,编译器可以自行选择先对函数中的哪一个参数求值,这样做提高了编译器的效率,但是如果在函数的参数里使用了递增运算符会产生一些问题

问题分析

代码语言:javascript
复制
ans = num/2 + 5*(1 + num++)

我们可能认为先计算num/2,接着计算5*(1 + num++),但是编译器可能先计算第二项,递增num,然后再计算num/2时结果可能偏大。

结果可能会有多种情况,准确的说,结果是未定义的,这意味着C标准并未定义结果是什么。

如何避免这种问题的产生:

遵循以下规则(详见C Primer Plus)

如果一个变量出现在一个函数的多个参数里,不要对该变量使用递增或者递减运算符。 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或者递减运算符。

PS:

对于第二条规则适用于复杂的多项运算包括了加减乘除,如上面的问题例题。但是如果复杂运算中只包含了递增或者递减运算,如上面的复杂的递增运算符组合运算多个例题,只有++运算则可以依据上面的++的原理进行分析和解题,可以正常计算。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复杂的递增运算符组合运算
    • 例题:
    • 优先级问题
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档