![](/img/trans.png)
[英]Declare and define the function distance() to find the Euclidean distance between the two points (x[0], y[0]) and (x[1], y[1]) in c
[英]#define FUNC(x,y) x=^y; y^x; in c
我有麻烦去理解当有定义然后有两个异或表达式时的含义。 这个定义做什么?
我尝试发送x = 8,y = 7,结果是x = 15和y = 8,为什么会发短信?
这是程序:
#define FUNC(a,b) a^=b; b ^=a;
int main(){
int x=8,y= 7;
FUNC(x,y);
printf("%d %d\n",x, y);
}
就是一样的
int main(){
int x=8,y= 7;
x^=y; y ^=x;;
printf("%d %d\n",x, y);
}
因为定义只是一个简单的文本替换,即所有带有a
将被x
替换,所有带有b
将被y
替换。
^
是按位XOR运算符。
所以首先x = 8 ^ 7 = 15
然后y = 7 ^ 15 = 8
这是因为XOR产生1
时位中的一个而不是两个都是1
x = 8 = 0b00000000000000000000000000001000 // Assuming 32 bit int
y = 7 = 0b00000000000000000000000000000111 // Assuming 32 bit int
x=x^y = 0b00000000000000000000000000001111 = 15
x = 15 = 0b00000000000000000000000000001111 // Assuming 32 bit int
y = 7 = 0b00000000000000000000000000000111 // Assuming 32 bit int
y=y^x = 0b00000000000000000000000000001000 = 8
^^^
Zero because both bits are 1
更多关于原始问题的信息:
该宏具有按位方法的前两个步骤,可以交换两个值:
(1) a ^= b
(2) b ^= a
(3) a ^= b
让我们稍微扩展一下:让x = a; y = b,我们将通过x和y追踪代数。 首先,用完整的表达式替换每个“更新”:
(1) a = a ^ b
(2) b = b ^ a
(3) a = a ^ b
现在,将x和y替换为从上到下滴下:
(1) a = x ^ y
(2) b = y ^ (x ^ y)
(3) a = (x ^ y) ^ (y ^ (x ^ y))
删除括号并重新排列术语:
(1) a = x ^ y
(2) b = x ^ y ^ y
(3) a = x ^ x ^ y ^ y ^ y
...给我们留下b = x; a = y
现在,由于只有前两个步骤,因此最终结果是
b = x (original value of a)
a = x ^ y (a.k.a. a ^ b)
这为您解释了眼前的问题吗?
定义多语句宏的规范方法是
#define FUNC() do { statement1; statement2; } while(0)
即使if(b) FUNC();
做到了来电者的想法。
几年前进行了讨论,导致MISRA对此进行了更改。 MISRA不再推荐“做”策略,因为他们说应该总是使用花括号,例如if(b) { FUNC(); }
if(b) { FUNC(); }
可以很好地处理不受保护的多语句宏(并防止Apple证书goto搞砸之类的错误)。 相反, do{...
会伪装使用花括号的失败。
我想我个人还是站在do
一方,即使仅仅是因为我知道这一点。
CERT也推荐该技术。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.