异或交换:*a ^= *b;*b ^= *a;*a ^= *b;
你说的三式联合是这样的吧:*a ^= *b ^= *a ^= *b;
单就三式联合的运算来说,赋值语句是从右向左运算的,所以实际的运算顺序是这样:
*a ^= (*b ^=( *a ^= *b));
但是,在编译器里这将无法编译。因为会导致未定义的行为(undefined behavior)。C 语言的一条语句中,一个变量的值只允许改变一次,像x = x++ 这种代码都是未定义行为。在C语言里没有哪条规则保证以上两种写法是等价的。
另外,用异或交换变量既不会加快运行速度(反而更慢,六读三写加三次异或),也不会节省空间(中间变量tmp 通常会用寄存器,而不是内存空间存储)。这个技巧的意义完全在于应付变态的面试,知道就行了,绝对不要放在产品代码中。
补充一下,如果a和b的值相同,异或交换就会使a和b的值都为0,在程序中会是极大的隐患,所以说这只是“面试技巧”。
温馨提示:答案为网友推荐,仅供参考