[问题] XOR交换值问题

楼主: ptt0720 (湿湿)   2017-11-23 11:10:44
语言:CPP
今天写quick sort的时候发现原本常用的交数值方法好像有观念上的问题
https://i.imgur.com/GwH4NbM.png
我习惯的用法是第二十七行 直接用参考交换两个值
但是发现印出来后都是一堆0
后来交叉比对后发现是XOR交换值的问题
想请问一下是不是阵列用XOR交换数值会出错?
想请问一下原因 麻烦各位大大了
作者: Hazukashiine (私は幸せです)   2017-11-23 11:42:00
One registeris is cheap.认真回 那个你这个写法啊 是 UB 喔不能在同一个 SP 区间赋值两次
楼主: ptt0720 (湿湿)   2017-11-23 11:44:00
请问UB是什么意思
作者: Hazukashiine (私は幸せです)   2017-11-23 11:45:00
Undefined Behavior
楼主: ptt0720 (湿湿)   2017-11-23 11:46:00
原来如此 我之前都这样做 然后没出错 我以为可以这样子
作者: Hazukashiine (私は幸せです)   2017-11-23 11:46:00
简单说 要把异或赋值拆成三行写才行
楼主: ptt0720 (湿湿)   2017-11-23 11:49:00
https://i.imgur.com/qS5A6kA.png 这是原本写法的内存贴上来给大家参考 不要踩雷了
作者: stupid0319 (征女友)   2017-11-23 11:58:00
原本写法的没差啊!?a跟b的值对调了不是吗
楼主: ptt0720 (湿湿)   2017-11-23 12:05:00
我也不清楚 求解答@@我原本的写法交换完 内存不是对调 是不一样 如图然后在main里面内存少一个bit是因为0省略掉了?
作者: alan23273850   2017-11-23 12:12:00
要不要改成非阵列的写法观察看看,假设a,b,c,d之类而且楼主30行是不是怪怪的
作者: CaptainH (Cannon)   2017-11-23 12:16:00
就算拆成三行,a=b 时会让 a,b 都变成0
楼主: ptt0720 (湿湿)   2017-11-23 12:24:00
30行原本是SWAP 会印出一堆0 资料里没有0
作者: galic (嘎利)   2017-11-23 12:29:00
你推文那张图是少了空白吧 位址明明一样xor swap 会 zero out 很明显就是你x y 都是同一个“空间”a b
作者: boss0405 (boss)   2017-11-23 13:10:00
warning: operation on 'a' may be undefined [-Wsequence-point]
作者: peterwu4 (notd)   2017-11-23 13:53:00
用mingw的c++帮你试,这样换的过来~ 4.9.2 32bit环境
作者: galic (嘎利)   2017-11-23 14:30:00
就你i j index一样会zero out,加个判断式index一样不用swap…
楼主: ptt0720 (湿湿)   2017-11-23 14:42:00
请问一下zero out是什么意思index一样会跑出零 谢谢大大解答 请问我要如何搜寻这方面的知识q
作者: galic (嘎利)   2017-11-23 15:55:00
zero out就是被清成0啦 XD
作者: peterwu4 (notd)   2017-11-23 16:02:00
xor自己XD 我晚惹~
作者: LPH66 (-6.2598534e+18f)   2017-11-23 17:05:00
虽然晚了, 我的 #1Deo3lyi 这篇也可参考一下然后如上面所说, 即使写三条碰到 a b 同位置也会出事
作者: kingofsdtw (不能閒下來!!)   2017-11-24 19:12:00
你自己都看不懂了...为何要写一些要动脑的coding style?compiler会最佳化..别害同事
作者: steve1012 (steve)   2017-11-25 02:48:00
效能瓶颈地方通常不是这个 swap…

Links booklink

Contact Us: admin [ a t ] ucptt.com