[英]Understanding summation logic
这是求和逻辑,它不使用+
运算符执行加法,如下所示,
int add(int a, int b) {
const char *c=0;
return &(&c[a])[b];
}
任何人都可以让我理解return
声明如何沸腾添加a
& b
。
请记住,因为a[b]
与*(a + b)
,所以每当索引数组时都会进行隐式添加。 这意味着&a[b]
是a + b
因为地址和解除引用运算符被抵消了。
然后,将c
设置为0
,我们可以替换:
&(&c[a])[b] = &(&*(0 + a))[b] = &(a)[b] = &a[b] = &*(a + b) = a + b
我不确定这是否定义明确且可移植,但我认为它适用于大多数“典型”系统。
好吧,它没有你想象的那么复杂,但是你肯定没有什么可以使用的,因为它有点脏;)
c
是一个指向NULL
或0
的指针,你取偏移量&0[a]
,恰好是a
,然后从&0[a]
取偏移量[b]
&0[a]
,即0+a+b
。
这就是魔术。
这只是添加指针导致添加。
要理解它
&c[a] = c + a;
和
&(&c[a])[b] = &c[a] + b = c + a + b;
当你取&(&c[a])[b]
,它将给出c + a + b
。 由于c为0,因此为a+b
。
实际上,为了在没有+
运算符的情况下求和两个整数,使用按位运算符和全加器电路中使用的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.