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

不明白自加自减的过程?

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

对于这个自加自减的问题搞不明白,有人能说得简单,明白,详细点嘛?最好用100的那个例题做详细说明,无尽感谢,谢谢!

正在回答

21 回答

通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及好几个基本概念! 先确定你清楚“运算符”、“表达式”和“语句”的概念:

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

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

表达式后面加上一个分号才是一个完整的“语句”。

还有一个关键内容:前面说使操作数自增1是自增表达式的副作用,那么这个副作用什么时候发生呢? 准确地说是在“序列点”后保证会发生。 序列点这个概念比较复杂,对于例题中这个简单的情况,你只需要知道:在本语句结束后,这些副作用肯定发生了。


下面讲解下3-3的例题:

int a = 100; 最开始时a是100。

打印 a++;  这个printf会打印a++的值,注意是a++表达式的值,看我前面的讲解,a++的值就是a的值,也就是100。 别忘了这语句结束后a的值就会自增1(也就是副作用发生了)。

打印 ++a;  目前a的值为101。现在要打印++a表达式的值,++a的值就等于a+1,所以会打印出102。 此语句后a=101+1=102。

打印 --a;  这次要打印--a表达式的值,同自增一个道理,--a的值等于a-1,所以会打印出101。 此语句后a=102-1=101。

打印 a--;  a--表达式的值就是a的值,所以打印出101。 此语句后a=101-1=100。

打印 a+1;  这表达式与自增无关,只是打印a+1的值,就是101。 对a本身的值没有影响(加法表达式没有副作用)。

打印 a;  这时a的值当然还是100了。

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

杂果绘 提问者

非常感谢!
2015-06-26 回复 有任何疑惑可以回复我~
#2

章然

讲的很详细,谢谢!
2015-06-30 回复 有任何疑惑可以回复我~
#3

一度onetems

太感谢了
2015-07-02 回复 有任何疑惑可以回复我~
#4

qq_蓝鸟_1

解释很到位啊!
2015-09-28 回复 有任何疑惑可以回复我~
#5

空_

非常感谢!
2015-10-10 回复 有任何疑惑可以回复我~
#6

/无所谓的结局…×←_←

终于弄清楚了
2015-10-13 回复 有任何疑惑可以回复我~
#7

柠檬汁好喝

henlihai
2015-10-13 回复 有任何疑惑可以回复我~
#8

Backkom

非常感谢
2015-10-20 回复 有任何疑惑可以回复我~
#9

笑川

mark
2015-10-21 回复 有任何疑惑可以回复我~
#10

包小龙虾

序列点是因为有分号吗?因为有分号所以副作用要在分号前都结束,如果是a++;值就是a+1而不是a了是吗?
2018-08-01 回复 有任何疑惑可以回复我~
#11

onemoo 回复 包小龙虾

a++表达式的值是a自增之前的值,并不是a+1。 关于何时是序列点,C标准有比较复杂的一组规定。语句结束时算是序列点,也就是你说的分号处。
2018-08-01 回复 有任何疑惑可以回复我~
#12

包小龙虾 回复 onemoo

我的意思是说如果单单是a++表达式的值是a自增之前的值,并不是a+1。但是如果是a++;(这边a++后有分号)值就是a+1而不是a了是吗?我这样理解对吗?
2018-08-04 回复 有任何疑惑可以回复我~
#13

onemoo 回复 包小龙虾

“a++表达式的值是a自增之前的值,并不是a+1”这点没错。“但是如果是a++;(这边a++后有分号)值就是a+1而不是a了是吗”—— 你说的“值就是a+1”指的是谁的值呢?? a++; 如果程序运行到分号之后,那么这个a++表达式已经求值完毕执行完毕(a++表达式的值就是a+1)了。运行到分号之后就没有a++表达式什么事了,而这时变量a的值肯定已经自增了。
2018-08-08 回复 有任何疑惑可以回复我~
#14

慕瓜6542481

一下明白了,非常感谢!
2021-05-27 回复 有任何疑惑可以回复我~
查看11条回复

感谢,太感谢了,思考了好久终于明白了。

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

楼主棒棒,简单明了

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

关键就在副作用上面  初学者 教材里没提到

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

感谢楼主~!!

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

非常感谢

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

赞一个~终于看懂了

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

原来执行printf 语句要根据前一个printf的执行结果再执行下一个printf的   谢谢Lz的详细解答   棒棒的

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

谢谢,懂了

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

通俗易懂


0 回复 有任何疑惑可以回复我~
首页上一页12下一页尾页

举报

0/150
提交
取消

不明白自加自减的过程?

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