关于Linux和Windows中++a + a++ 的运算结果,请大神指点

HelloCPPlus 2018-03-15 06:42:06
初学C语言,关于++a + a++ 在Windows和Linux中运行结果不同非常懊恼

#include "stdio.h"

int main()
{
int a = 1;
printf("++a + a++ = %d\n",++a + a++);

int b = 1;
printf("++b + ++b + ++b + ++b = %d\n", (++b) + (++b) + (++b) + (++b));

return 0;
}


Windows下运行结果:
++a + a++ = 4
++b + ++b + ++b + ++b = 20

Linux下运行结果:
++a + a++ = 5
++b + ++b + ++b + ++b = 15

两者结果完全不同。
首先阐述一下我个人理解,希望各位大神帮忙指点指点哪里有错,万分感激。

Windwos下运行结果为4,是因为先计算a++,此时相当于生成一个临时变量temp =1,而a=2,然后计算++a,此时使用a本体,也就是++2,结果就成为 3+1=4;
结果为20,是因为第一个++b之后,b的值变为2,第二个++b之后,b的值变为3,依次算到第四个++b的时候,b的值变为5,因为前置++使用的是变量本体,所以就变成了4个5相加,结果就成了20。

Linux下为什么等于5,笨拙的我实在没想出来是为什么,希望大神帮忙解释解释。至于等于15,是不是因为Linux的运算方式与Windows不同,其计算方式是第一个++b后,b=2,第二个++b之后,b=3,此时,会先将前两个++b进行相加,并且使用b本体,也就是3+3=6,而计算第三个++b的结果是4,此时再进行相加,6+4=10,最后计算第四个++b,4+1=5,然后相加结果为10+5=15.

以上是个人理解,望各位大神帮忙指点指点,万分感激
...全文
758 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertS 2018-03-23
  • 打赏
  • 举报
回复
引用 10 楼 HelloCppWorld 的回复:
[quote=引用 8 楼 qq_41607490 的回复:] 纠结这种问题确实是没有意义的,归根结底的原因要么是编译器机制不同,要么是系统区别,但不管是什么问题都是没有太大意义的,除非你以后当一个老师,还可以给学生说点这种类似脑筋急转弯的题,对于问题本事,本人觉得你指需要了解a++,++a,的却别,以及,在你用的比较的多的系统中(例如本人是在Linux下工作)运算符的使用,好的程序往往是简单,明了,这样才能提高工作效率,以及开发效率。
之前朋友去面试的时候,有一家公司的面试题里就有几道这种类似的题,然后回来和我聊,所以我才想研究研究其中的原理[/quote] 单独的a++和++a是有区别的,实际的运算过程也是不同的,这个是需要知道的,但是这两种运算的组放到一起、或者作为函数参数、或者作为printf输出,这种类似的问题结果是不确定的,研究起来也没有太大意思
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 5 楼 shihengzhen101 的回复:
不用纠结这种表达式是怎么算的,结果你也看到了,不同的平台计算结果不同,所以我们不建议写这样的代码 以上几位也提到了,这个和求值顺序有关,但是有些表达式在标准中是未定义顺序的,并不能保证每次的计算顺序都一致 从结果推过程也许说的通,但是只看表达式,很难准确猜出它下一次的计算结果
主要是之前在一份面试题里看到的,所以才想搞明白
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
建议查找表达式计算顺序的有关资料 这种表达式是未定义的,任何处理结果都可以 ++a + a++ 可以分解为两个子表达式 ++a 和 a++,但是标准并没有规定是从左至右求解子表达式还是从右至左
嗯..谢谢
「已注销」 2018-03-22
  • 打赏
  • 举报
回复
这种问题每个月至少有一个人问
HelloCPPlus 2018-03-21
  • 打赏
  • 举报
回复
引用 9 楼 qq_33302340 的回复:
搞明白求值顺序就行了 也没必要研究这么细致
主要是搞不清为什么,心里别扭
HelloCPPlus 2018-03-21
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767http://bbs.csdn.net/topics/370153775
这个确实很有用,谢谢啦
HelloCPPlus 2018-03-21
  • 打赏
  • 举报
回复
引用 8 楼 qq_41607490 的回复:
纠结这种问题确实是没有意义的,归根结底的原因要么是编译器机制不同,要么是系统区别,但不管是什么问题都是没有太大意义的,除非你以后当一个老师,还可以给学生说点这种类似脑筋急转弯的题,对于问题本事,本人觉得你指需要了解a++,++a,的却别,以及,在你用的比较的多的系统中(例如本人是在Linux下工作)运算符的使用,好的程序往往是简单,明了,这样才能提高工作效率,以及开发效率。
之前朋友去面试的时候,有一家公司的面试题里就有几道这种类似的题,然后回来和我聊,所以我才想研究研究其中的原理
心文花雨 2018-03-20
  • 打赏
  • 举报
回复
不同的编译器算出来的结果不同
啊哈moment 2018-03-20
  • 打赏
  • 举报
回复
搞明白求值顺序就行了 也没必要研究这么细致
qq_41607490 2018-03-20
  • 打赏
  • 举报
回复
纠结这种问题确实是没有意义的,归根结底的原因要么是编译器机制不同,要么是系统区别,但不管是什么问题都是没有太大意义的,除非你以后当一个老师,还可以给学生说点这种类似脑筋急转弯的题,对于问题本事,本人觉得你指需要了解a++,++a,的却别,以及,在你用的比较的多的系统中(例如本人是在Linux下工作)运算符的使用,好的程序往往是简单,明了,这样才能提高工作效率,以及开发效率。
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
自信男孩 2018-03-16
  • 打赏
  • 举报
回复
对于这样的表达式研究起来意义不大,也不建议写这样的代码。因为自增运算符本身就有副作用,副作用用好了可以,用不好会出错。
++a + a++ = 5
++b + ++b + ++b + ++b = 15
像这样的表达式,研究起来有啥用?平时写这样的表达式不被批都怪了。作为程序员建议还是老老实实写一些别人一眼就能看懂的代码吧
  • 打赏
  • 举报
回复
回字有4种写法,还是5种写法,还是6种写法?
AlbertS 2018-03-16
  • 打赏
  • 举报
回复
不用纠结这种表达式是怎么算的,结果你也看到了,不同的平台计算结果不同,所以我们不建议写这样的代码 以上几位也提到了,这个和求值顺序有关,但是有些表达式在标准中是未定义顺序的,并不能保证每次的计算顺序都一致 从结果推过程也许说的通,但是只看表达式,很难准确猜出它下一次的计算结果
N_Sev7 2018-03-15
  • 打赏
  • 举报
回复
不是系统,而是编译器的处理不同~
幻夢之葉 2018-03-15
  • 打赏
  • 举报
回复
建议查找表达式计算顺序的有关资料 这种表达式是未定义的,任何处理结果都可以 ++a + a++ 可以分解为两个子表达式 ++a 和 a++,但是标准并没有规定是从左至右求解子表达式还是从右至左

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧