使用XOR交换值
参见英文答案 >
Sequence Point – Xor Swap on Array get wrong result????????????????????????????????????1个
>???????????? How does XOR variable swapping work?????????????????????????????????????9个 这两个宏有什么区别? #define swap(a,b) (((a) ^ (b)) && ((a) ^= (b) ^= (a) ^= (b))) 要么 #define swap(a,b) (((a) ^ (b)) && ((b) ^= (a) ^= (b),(a) ^= (b))) 我看到第二个宏here,但无法理解为什么它不像第一个那样写?我错过了一个特殊原因吗? 解决方法
首先将在C99??和C11中调用未定义的行为.
在C99中,可以理解为;由于缺少序列点,它们将调用未定义的行为. C-faq:
说明: C11文档说: 6.5表达式(第2页):
在(a)^ =(b)^ =(a)^ =(b)中,对a的副作用是未序列的,因此调用未定义的行为.应该指出的是,C11 6.5 p1表示:
这保证了 (a) ^= (b) ^= (a) ^= (b) | | | | 1 2 3 4 保证在最左边^ =运算符的结果计算之前计算所有子表达式1,2,3和4.但是,这并不能保证在最左侧^ =运算符的结果的值计算之前保证表达式3的副作用. 1.重点是我的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |