BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #42695同步于 2010/8/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】arr[i]=(arr[i]+arr[j])-(arr[j]=arr[i])

KilltheThree
2010/8/25镜像同步9 回复
像题目所写的方式,程序运行出来是arr[i]=arr[j],为什么不能实现两个数据交换呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zwp机器人#1 · 2010/8/25
是先执行(arr[j]=arr[i]) 在执行(arr[i]+arr[j]),最后就是2*arr[i]-arr[i]) 。所以结果都等于arr[i]
shenlei机器人#2 · 2010/8/25
re 加减操作结合性,右... 【 在 zwp (Shawn Johnson) 的大作中提到: 】 : 是先执行(arr[j]=arr[i]) 在执行(arr[i]+arr[j]),最后就是2*arr[i]-arr[i]) 。所以结果都等于arr[i]
zwp机器人#3 · 2010/8/25
【 在 shenlei 的大作中提到: 】 : re : 加减操作结合性,右... a=abs((b=a)-(a+b)); 但是这个好像,先执行了左边,后执行了右边。
wildpointer机器人#4 · 2010/8/25
arr[i]=(arr[i]+arr[j])-(arr[j]=arr[i]) 如果先执行了 (arr[i]+arr[j]),再执行(arr[j]=arr[i]),结果就是arr[j],完成了交换 如果先执行了(arr[j]=arr[i]),再执行(arr[i]+arr[j]),则结果是arr[i],没有交换 所以,关键是减法运算符两边的操作数求值顺序不确定 【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】 : 像题目所写的方式,程序运行出来是arr[i]=arr[j],为什么不能实现两个数据交换呢?
shenlei机器人#5 · 2010/8/25
更正前面的错误,加减是左结合从左到右... 【 在 zwp (Shawn Johnson) 的大作中提到: 】 : a=abs((b=a)-(a+b)); : 但是这个好像,先执行了左边,后执行了右边。
shenlei机器人#6 · 2010/8/25
居然带头讨论个没什么意思的问题,罪过啊... (a+b)*(b-a)先计算那边没有影响,而你这个先计算哪边对最终结果有影响... 至于先计算那边,C/C++标准没有定义... 摘自 C/C++ 语言中表达式的求值 裘宗燕 ----------------- 一个C/C++ 系统可以永远先算左边或永远先算右边,也可以有时先算左边有时先算右边,或在同一表达式里有时先算左边有时先算右边。不同系统可能采用不同的顺序(因为都符合语言标准);同一系统的不同版本完全可以采用不同方式;同一版本在不同优化方式下,在不同位置都可能采用不同顺序。因为这些做法都符合语言规范。在这里还要注意顺序点的问题:即使某一边的表达式先算了,其副作用也可能没有反映到内存,因此对另一边的计算没有影响。 ----------------- 【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】 : 像题目所写的方式,程序运行出来是arr[i]=arr[j],为什么不能实现两个数据交换呢?
zxsword机器人#7 · 2010/8/25
这样的代码风格是很不好的代码风格 因为我读不懂这样的代码=。=
wks机器人#8 · 2010/8/25
这……还真没歧义。
leimiaos机器人#9 · 2010/8/26
没有谁告诉你先算右边的等号还是左边的 【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】 : 像题目所写的方式,程序运行出来是arr[i]=arr[j],为什么不能实现两个数据交换呢?