理解求和逻辑

Sun*_*lly 7 c

这是在不使用运算符的情况下执行加法的求和逻辑,+如下所示,

int add(int a, int b) {
   const char *c=0;
   return &(&c[a])[b];
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我理解如何return声明如何添加a&b.

unw*_*ind 12

请记住,既然a[b]是相同的*(a + b),那么每当索引数组时都会进行隐式添加.这意味着,&a[b]a + b因为地址和取消引用运营商抵消.

然后,c设置为0,我们可以替换:

&(&c[a])[b] = &(&*(0 + a))[b] = &(a)[b] = &a[b] = &*(a + b) = a + b
Run Code Online (Sandbox Code Playgroud)

我不确定这是否定义明确且可移植,但我认为它适用于大多数"典型"系统.


The*_*dis 7

好吧,它没有你想象的那么复杂,但是肯定没有什么可以使用的,因为它有点脏;)

c是一个指针,NULL0与你采取的偏移&0[a],而这正是a,然后你把偏移[b]距离&0[a],这是0+a+b.

这就是魔术.