为了账号安全,请及时绑定邮箱和手机立即绑定

标题: 3-3 自增与自减运算符 这节课我来来回回想了很多次,也看了很多问答题,但都不太好,请各位解答下我心中的疑惑

这是他的说明:

无论是a++还是++a都等同于a=a+1,在表达式执行完毕后a的值都自增了1,

 无论是a--还是--a都等同于a=a-1,在表达式执行完毕后a的值都自减少1。

我理解的意思有两种意思:  定义一个变量 int a=1;

1:     a++  或  ++a  ,运算后a的最终结果是一样的,a都等于2     

        而a--  或   --a,,运算后a的最终结果是一样的,a都等于0

2:  也就是说  a++  或  ++a ,a--  或   --a, 都有多余的一个。

 关键是事实不是这样的,我想不通,按照它的说明我这样理解哪里不对?

我想不通,所以这节课我来来回回想了很多次,也看了很多问答题,但都不太好


正在回答

2 回答

  1. 你所描述的理解是对的。在语句结束后a确实都自增/自减了。

  2. 当然不是多余的啦。关键区别就在于这个前置自增和后置自增表达式本身的值上。

关于上面的第2点,解答如下:

通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及“运算符”、“表达式”的概念。

++ 是一个“自增运算符”,自增运算符有两种形式:前置自增(++a)后置自增(a++)

运算符操作数合起来就是一个表达式(a++、++a都是表达式,a就是操作数)。注意:每一个表达式本身都有值(和其类型),有的表达式还有“副作用”。比如自增表达式的副作用就是使其操作数自增1。那么自增运算表达式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 

所以,如果有这样的代码 i = a++;  你可以认为:获得的是a++这个表达式的值(也就是a当时的值),a++表达式的副作用再将a自增。 同理 i = ++a; 这里 获得的是++a表达式的值(就是a自增后的值)。


还有一个关键的内容,虽然你的问题中没有体现出来。那就是:前面说使操作数自增1是自增表达式的副作用,那么这个副作用什么时候发生呢? 准确地说是在“序列点”后保证会发生。 序列点这个概念比较复杂,代码中的很多地方算是序列点,简单地说:你先记住“语句结束时”是一个序列点。这序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在这一点之后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须已经发生了。 这一点非常关键,本站的课程中并没有讲解,甚至本站的题目在这一点上还出现了大量的错误!(我强烈怀疑讲师都不明白这点...)


1 回复 有任何疑惑可以回复我~

onemoo :   请帮我看一看,我从你给的答案中有所领悟,下图是我的理解你帮忙看下是否是正确的,还有解疑和纠正

http://img1.sycdn.imooc.com//55ee84b20001277e09880421.jpg

2 回复 有任何疑惑可以回复我~
#1

onemoo

前4个printf分析得很对。 第5个printf中:符号a始终就代表那一个变量。变量的值本来就是可以变化的嘛,a在第4行中被初始化为100,之后a的值就随着代码流程而变化(自增/自减),在这次printf调用前a的值恰好又变回了100。而这次打印的是“a+1表达式”的值,所以打印出101,这不会影响变量a自身的值(加法表达式没有副作用)。与其说a取到的是“上一次a的值”,不如说这就是a当前的值。 最后一个打印的还是a当前的值,自然还是100了。
2015-09-09 回复 有任何疑惑可以回复我~
#2

贰到极限 提问者 回复 onemoo

这就是你所说的副作用吗? 这种副作用只存在于 自增与自减(本节中) 中,一旦被打断或被隔开就要重新被赋值。 这样说你可能听不太明白我所要表达的意思。我取个例子吧,还是上面这张图来说: 我在第17行中,加入一段代码: int a = 80; 那么第18行代码的输出结果是:a=81, 那第19行的代码输出结果就应该是: a=81, 而22行:a=81, 25行:a = 80 . 你看我的理解对吗?他的副作用一旦被打断就要重新 选值。。。
2015-09-09 回复 有任何疑惑可以回复我~
#3

onemoo 回复 贰到极限 提问者

如果在17行重新将a赋值为80。那么在18行会打印出79,并且18行执行之后a的值也自减为79。19行会打印出79,a会减为78。在22行会打印出79,a的值还是78。 你是不是把18/19行看成自增了?! 还有,没有什么“副作用被打断”之说,18/19行代码执行后,对a的副作用肯定就生效了,a的值就是相应的自增/自减了。
2015-09-10 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C语言入门
  • 参与学习       926212    人
  • 解答问题       20797    个

C语言入门视频教程,带你进入编程世界的必修课-C语言

进入课程

标题: 3-3 自增与自减运算符 这节课我来来回回想了很多次,也看了很多问答题,但都不太好,请各位解答下我心中的疑惑

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信