a=a+b-(b=a); 这也应该是有问题的代码吧?

gnwd
gnwd 2017-12-18 字数 165

a=a+b-(b=a);

b=a的值是由b确定的,但是b被改变为a这个副作用却不能确定什么时候发生。

因此,如果一开始a=3, b=5。经过这行之后

a=3, b=3

or

a=5, b=3

都是可能的结果

这个理解对吗?

1 个Like
39 个回复
gnwd
gnwd 2017-12-18
BTATCN
公猫 2017-12-18

写这种代码的绝大部分是SB而已.

【 在 gnwd 的大作中提到: 】

: a=a+b-(b=a);

: b=a的值是由b确定的,但是b被改变为a这个副作用却不能确定什么时候发生。

: 因此,如果一开始a=3, b=5。经过这行之后

: ...................

il15
il15 2017-12-18

为啥我理解成了个交换,有编译验证过吗?

【 在 gnwd (bye) 的大作中提到: 】

: a=a+b-(b=a);

: b=a的值是由b确定的,但是b被改变为a这个副作用却不能确定什么时候发生。

: 因此,如果一开始a=3, b=5。经过这行之后

: ...................

gnwd
gnwd 2017-12-18

实际结果估计是交换,而且看上去代码比较优美

【 在 il15 的大作中提到: 】

: 为啥我理解成了个交换,有编译验证过吗?

milksea
肥了,又肥了 >>>_<<< 2017-12-18

这么丑的代码,你的审美歪到哪里去了?

你既然都自己分析出两种数值结果的可能了,结果依赖于求值次序,还不知道是 UB?UB 在标准中就是写错的代码的代名词。

【 在 gnwd 的大作中提到: 】

:【 在 il15 的大作中提到: 】

:: 为啥我理解成了个交换,有编译验证过吗?

::

:...................

lag
为众人抱薪者 不可使其冻毙于风雪 2017-12-18

你的优美是占行数少吗

【 在 gnwd (bye) 的大作中提到: 】

: 实际结果估计是交换,而且看上去代码比较优美

nabice
葱油饼 2017-12-18

挖坑的吧,以前貌似也问过类似的问题。

【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】

: 这么丑的代码,你的审美歪到哪里去了?

: 你既然都自己分析出两种数值结果的可能了,结果依赖于求值次序,还不知道是 UB?UB 在标准中就是写错的代码的代名词。

: :【 在 il15 的大作中提到: 】

: ...................

gnwd
gnwd 2017-12-18

怎么能是挖坑呢……

以前的代码是看起来没有用,实际上也没有用的

【 在 nabice 的大作中提到: 】

: 挖坑的吧,以前貌似也问过类似的问题。

stub
stub 2017-12-18
gnwd
gnwd 2017-12-18

我自己不太确定,想让你确认一下

【 在 milksea 的大作中提到: 】

: 这么丑的代码,你的审美歪到哪里去了?

: 你既然都自己分析出两种数值结果的可能了,结果依赖于求值次序,还不知道是 UB?UB 在标准中就是写错的代码的代名词。

giggham
make clean 2017-12-18

去把序列点的定义阅读理解好,然后再也别问这种问题了

【 在 gnwd 的大作中提到: 】

: a=a+b-(b=a);

: b=a的值是由b确定的,但是b被改变为a这个副作用却不能确定什么时候发生。

: 因此,如果一开始a=3, b=5。经过这行之后

: ...................

officercat
黑猫警长·奈叶要加油 2017-12-18

交换?(b=a)里把b的值变成a,然后前面那个b不同步更新值?

【 在 il15 (il15) 的大作中提到: 】

: 为啥我理解成了个交换,有编译验证过吗?

dreamr
追梦人 2017-12-18

左结合 右结合?

【 在 gnwd 的大作中提到: 】

: a=a+b-(b=a);

: b=a的值是由b确定的,但是b被改变为a这个副作用却不能确定什么时候发生。

: ....................

logical
obama 2017-12-18

这种代码真是一点意义也没有,主要考察记忆力?。。。

liangf
大侠 2017-12-18

这么写代码的显然是没有好好读读MISRA C规范的

里面规则13.4明确要求:

The result of an assignment operator should not be used.

【 在 gnwd (bye) 的大作中提到: 】

: a=a+b-(b=a);

tmchzy2
tmchzy2 2017-12-18

这个的作用应该是:不用第三个变量,交换两个变量的值。很多面试会有这种问题。

【 在 lag 的大作中提到: 】

: 你的优美是占行数少吗

gnwd
gnwd 2017-12-18

哦哦,还有这个规范呢

这段代码好像是来自于stackover网站,作为精美的代码贡献出来的。也许其他语言没毛病

【 在 liangf 的大作中提到: 】

: 这么写代码的显然是没有好好读读MISRA C规范的

: 里面规则13.4明确要求:

: ...................

liangf
大侠 2017-12-18

C的标准对编译器的行为的规定是有“模糊”的地方的,而且C本身没有任何程序运行时候

的错误检测机制。不好好写代码后果可能是灾难性的

【 在 gnwd (bye) 的大作中提到: 】

: 哦哦,还有这个规范呢

: 这段代码好像是来自于stackover网站,作为精美的代码贡献出来的。也许其他语言没毛病

eGust
十年 2017-12-18

如果非说不用第3个变量的话,标准做法也应该是 xor。另外加减法至少在 x86 上是有副作用的,并不利于编译器的优化

【 在 gnwd (bye) 的大作中提到: 】

: 实际结果估计是交换,而且看上去代码比较优美