C语言异或交换问题:A与B选项的正确性及区别解析
异或交换操作的选项分析与A、B区别解答
问题:以下哪个选项能实现对(*, *)的交换效果?注:^代表XOR(异或)操作。二进制运算规则:0 XOR 0 = 0,0 XOR 1 = 1,1 XOR 0 = 1,1 XOR 1 = 0。
选项:
A. (x, y): x ^= y ^= x ^= y;
B. (a[x], a[y]): a[x] ^= a[y] ^= a[x] ^= a[y];
C. (x, y): x -= y += x -= y;
D. (a[x], a[y]): a[x] -= a[y] += a[x] -= a[y];
已知C、D逻辑不正确,推测A正确,但不清楚A与B选项之间的区别是什么?
核心结论
A能正确交换两个独立变量;B仅在数组下标x≠y时有效,若x=y(即交换数组同一位置的元素)会导致数据丢失。
具体区别分析
选项A的逻辑:
操作对象是两个独立的变量x和y,链式写法x ^= y ^= x ^= y等价于三步独立异或操作:x = x ^ yy = y ^ x(此时x已是第一步的结果,即原始x^y)x = x ^ y(此时y已是第二步的结果,即原始x)
因为x和y是独立存储的变量,每一步都能获取到正确的中间值,最终完成交换,且不存在边界错误。
选项B的逻辑:
操作对象是数组元素a[x]和a[y]:- 当
x≠y时,两个数组元素是独立的内存位置,逻辑和A完全一致,能正常交换。 - 当
x=y时,a[x]和a[y]指向同一块内存。第一步a[x] ^= a[y]会把该位置的值变为原始值 ^ 原始值 = 0,后续两步异或都是基于0运算,最终该位置的值会被置为0,而交换同一个元素本应保持原值不变,这就出现了逻辑错误。
- 当
内容的提问来源于stack exchange,提问作者Ader
相关产品推荐
相关产品推荐

