理解求和逻辑

时间:2013-11-08 08:10:35

标签: c

以下是summation逻辑,它不使用+运算符执行添加,如下所示

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

任何人都可以让我了解return语句如何加入a& b

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:7)

好吧,它并不像你想象的那么复杂,但肯定你应该使用,因为它有点脏;)

c是指向NULL0的指针,您获取的偏移量&0[a]恰好是a,然后取偏移量{{ 1}}来自[b],即&0[a]

这就是魔术。

答案 2 :(得分:3)

这只是添加指针导致添加。

理解它

 &c[a]  = c + a;

 &(&c[a])[b] = &c[a] + b = c + a + b;

当您&(&c[a])[b]时,它会给c + a + b。由于c为0,因此为a+b

实际上,要获得两个不带+运算符的整数的求和,请使用按位运算符和全加器电路中使用的逻辑。