【发布时间】:2021-10-29 13:32:51
【问题描述】:
我遇到过这个函数
void reverseArray(int *a,int n)
{
for(int i=0,j=n-1;i<j;i++,j--)
{
a[i]^=a[j]^=a[i]^=a[j];
}
}
它正在反转给定的数组,但我无法理解这如何反转数组,Xor 运算符不是只返回非公共位。 那么反转给定数组的逻辑是什么。
【问题讨论】:
-
Re“非公共位”:当你翻转
a[j]中的非公共位时,它使这些位具有它们在a[i]中的值,因此结果等于@987654327 @。然后,从右到左,a[i]^=a[j]找到非公共位 (^) 并将它们 (^=) 存储在a[i]中。然后a[j]^=a[i]^a[j]翻转a[j]中的那些位,使其等于原始a[i]。然后a[i]^=a[j]^=a[i]^=a[j]将存储在a[i]中的非公共位与a[i](现在在a[j]中)的原始值进行异或,这样翻转非公共位以生成原始a[j],这存储在a[i]。 -
需要注意的是,这条语句的行为并没有被C标准定义,因为
a[i]的更新是没有顺序的。 -
请注意,有两种截然相反的方法可以回答这个问题。 (1) 这段代码的作者试图实现一个(反常的)目标,我们可以解释这个目标是什么,以及它是如何实现的。但是(2)正如您自己亲眼所见,此代码在第一次阅读时是不可能理解的。此外,它是未定义的:它甚至不能保证工作。因此,虽然这可能是一个值得学习的有用示例,但绝对绝对不是值得钦佩、模仿或用于真实、实用的程序的东西!