为什么a原值是100,a++还是100,++a就成了102了,--a和a--都是101,到底是为啥

来源:3-3 自增与自减运算符

太阳系新生

2019-07-12 14:16

a=100

printf(a++)不是该101吗?

写回答 关注

9回答

  • NO_3败者食尘
    2019-07-27 18:55:55

    a++和a--相当于a=a+1和a=a-1;所以不同于倒数第二个a+1,他多了一个赋值操作,所以a的值保留下来了,但是单纯的a+1只能在那一行输出的时候+1,并不能保留这个值

  • leoliqian
    2019-07-25 00:35:20

    感谢weixin_慕后端1512621的提问,让我重新审视了自己上一个答案,发现第6、7条思路不够严谨,重新梳理了一下,作出修改如下:
    6.a+1=100+1=101(运算,得结果,运算前数值为上一公式的运算结果,为100,运算100+1=101,而得出这个结果为101

    【注意】这里“为什么式"a+1"最后不取值?”

           我的猜想是这样的,程序默认"a++""a--""++a""--a""a"的运算自成一格体系,相当于一个主线任务,在"a+1"这一步中,"a"取上一运算值,此步骤的主线任务已经完成,后面的"+1"相当于支线任务,支线任务虽然会被执行,乃至得出结果,但其结果仅代表支线任务的完结,并不会影响主线任务,后面的主线任务仍然独立运行。(我是根据此步骤结尾处“//注意,这里并不改变a的值”这一提示推断出来的)。

    7.a=100(【注意】由上,因为公式"a+1""+1"部分相当于“支线任务”,其结果101并不影响“主线任务”,所以这里取值应该取"a+1"运算中的“主线任务部分”,即取"a"的值,其结果为100。)

    PS:我上一个回答,在运算7.中说跳过运算6.取值,仔细想想不够严谨,应该是运算7.中"a"的值,取了运算6."a+1"中的"a"值,即“主线部分”的运算结果,这种思路“主线任务”仍然独立且延续运行,这样才更符合程序运行的思路才对,毕竟程序不会像我们一样闹情绪,随便的中断、跳过某些步骤。我想这样的逻辑才更加严谨,欢迎大家共同探讨,谢谢各位。
           以上理论仅为个人推论,并不专业,仅供大家参考,还请以专业人士说明为上

  • leoliqian
    2019-07-22 15:33:20

    https://img2.mukewang.com/5d35638e000133c704060208.jpg

    以下分析内容为我个人的思考和推导,并不专业,仅供参考,如有错误,还望不吝指教:

            在该例子中a的数值是根据运算不断递进推演即上一运算的结果为下一运算a的数值。我个人的反思具体详解如下所示:

    1. a=100(目前“取值”为a=100)

    2. "a++"="a+1"="100+1"=101(先取值,再运算,这里的取值为上一个运算结果,即100,再运算100+1=101,运算结果为101)

    3. "++a"="a+1"="101+1"=102(先运算,再取值,运算前数值为上一公式的运算结果,为101;先运算101+1=102,再取值为102

    4. "--a"="a-1"="102-1"=101(先运算,再取值,运算前数值为上一公式的运算结果,为102;先运算102-1=101,再取值为101

    5. "a--"="a-1"="101-1"=100(先取值,再运算,这里的取值为上一个运算结果,即101,再运算101-1=100,运算结果为100)

    6. a+1=100+1=101(运算,得结果,运算前数值为上一公式的运算结果,为100,运算100+1=101,而得出这个结果为101【注意】这里的运算结果不影响下一运算a的值,即不被后面运算取值,如若后面运算需要取值,则应该跳过此条运算,取值上一运算最后的结果,即取值为100)

    7. a=100(【注意】因为公式"a+1"最后不取值,所以这里取值需要跳过公式"a+1",从公式"a--"的运算结果中取值,不需要任何运算。)

           以上解释是我个人自学反思的一些理解,如果答案对您有所帮助,希望您能点个赞,如果答案有错漏的地方,希望各位不啬言辞,为我纠正错误,共同进步,谢谢各位。

    leoliq... 回复weixin...

    我的理解是这样的,程序默认"a++""a--""++a""--a""a"的运算自成一格体系,相当于一个主线任务,在"a+1"这一步中,"a"取上一运算值,此步骤的主线任务已经完成,后面的"+1"相当于支线任务,支线任务虽然会被执行,乃至得出结果,但其结果仅代表支线任务的完结,并不会影响主线任务,后面的主线任务仍然独立运行。(我是根据此步骤结尾处“//注意,这里并不改变a的值”这一提示推断出来的) 这些说法都是我自己的推想,并不专业,仅供大家参考,以专业人士解答为主,不严谨甚至错误的地方,希望各位为我纠正,共同进步,谢谢各位!

    2019-07-24 23:47:30

    共 3 条回复 >

  • 奋斗的小青年_小半仙1o
    2019-07-21 23:00:55

    这句话很很重要“它们经常使用在循环中。”从上到下只有一个a,这个a是被循环用的。

    解释上面结果:a++=100(输出值是100,其实已经递增1了);

    下面++a=102(因为前面递增了1加上这次增的1所以就是102);下面的a就是以102为基础,以此类推......

  • weixin_慕瓜514738
    2019-07-14 22:57:59

    所以a++后,先输出100后,a的值变为101,++a后输出102;如果102基础上--a是输出101,再进行a--运算输出还是101,但a的值已经变成了100。

  • weixin_慕瓜514738
    2019-07-14 22:52:43

    a++是先执行该条语句(输出或是计算),然后再自减;++a则是相反,先自减,然后执行语句;

    a--和--a也一样。

  • 南城夜雨
    2019-07-13 14:41:07

    --a应该是98 a--应该是100


  • 南城夜雨
    2019-07-13 14:36:38

    a++可以这么理解  a在前面他已经取了值后面的+号对他没有影响  ++a,+加号在前所以要+1+1+a =102

    南城夜雨 回复太阳系新生

    那是负号不是减号相当于负一 我是这么理解的

    2019-07-19 12:42:53

    共 3 条回复 >

  • C和指针
    2019-07-12 15:17:06

    a++是先取值后运算的  ++a是先运算后取值  也就是说a是100是被  打印了一次  经过两次加一后才被 打印 所以就是加了2   所以被打印成  102


C语言入门

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

926210 学习 · 20797 问题

查看课程

相似问题