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

怎么理解【a++ = a】和【a++ =a+1】

551521460001420305000223.jpg

551521470001264605000223.jpg求详解  好晕


正在回答

4 回答

首先要说:a++ = a 和 ++a = a + 1 并不是两个合法的语句。这两个式子是说 a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 注意:我说的是++a和a++的值。

你要厘清“运算符”、“表达式”和“语句” 的关系:

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

表达式后面加上一个分号就是一个“语句”。

最后,这两个自增运算符的副作用(使a增加1)什么时候发生的呢? 我只能说在“序列点”之后肯定都发生了。代码中有的位置被称为“序列点”,具体哪些位置是序列点有些复杂,简单地说:“语句结束时”和“逻辑运算符的两个操作数之间”都算是序列点。这序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在这一点之后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须都已经发生了。

以上是你需要弄明白的,那对于你截图中的具体问题:

  1.  第一部分 b++ >= a*2 是一个比较表达式,比的是b++和a*2的值。b++的是就是b当时的值,也就是9,所以9大于等于10是假的。而这个表达式又是后面的“逻辑或”表达式的第一个操作数,因为它的结果是假,所以要继续判断第二个操作数(b-a<=a)的真假。记住逻辑运算符算是序列点,所以在判断b-a<=a时,b自增1的副作用已经发生了,b的值就变成10了,那b-a就是5,5小于等于5,为真。所以整个逻辑或表达式的值就是1

  2. 第二个截图中的题本身就有问题!!  原因还是因为序列点,在a+b%a-b/a+a*b-a++这个大复合表达式中,a出现了很多次,就是说需要取a的值很多次,可是其中的一个子表达式a++是有副作用的,而这个a自增1的副作用在什么时候发生是并不确定的,我只知道在整个语句结束之后a的值肯定是4,但a也可能在取第一个a的值时就已经是4了......也可能第一个a还是3,第二个a就是4了......也可能所有的a都是3......这一切都是有可能的。所以本题完全就错了!!


最后吐槽下:本站的C教程非常的“业余”,别再这里浪费时间学C了...

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

qq_An_myriver_0

大神,你还有更好的?那你再介绍一个呗·····
2015-06-07 回复 有任何疑惑可以回复我~
#2

redRibbon

learntocode 里面有么?
2015-07-17 回复 有任何疑惑可以回复我~
#3

onemoo 回复 redRibbon

learntocode是什么?
2015-07-17 回复 有任何疑惑可以回复我~
#4

redRibbon 回复 onemoo

不小心回复到下面去了。
2015-07-21 回复 有任何疑惑可以回复我~
#5

我的学习之旅 提问者

大神,你还有更好的?那你再介绍一个呗·····
2015-08-04 回复 有任何疑惑可以回复我~
查看2条回复

你的这两个表达式不合法!

在C语言中前置和后置自增运算符返回的结果是右值,不能放在等号左侧。

顺便提一下:在C++中,前置自增的结果是左值,可以放在等号左侧。

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

我的学习之旅 提问者

能举个例子吗 还是迷糊
2015-03-28 回复 有任何疑惑可以回复我~

http://www.imooc.com/code/5136 你可以看看这节中的内容,a++是先取值后运算,++a是先运算后赋值

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

我的学习之旅 提问者

亲 我问的是 怎么理解【a++ = a】和【a++ =a+1】 好晕啊
2015-03-27 回复 有任何疑惑可以回复我~
#2

我的学习之旅 提问者

怎么区分
2015-03-27 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

怎么理解【a++ = a】和【a++ =a+1】

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