7

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

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

谁能让我理解return声明如何归结为添加a& b

4

3 回答 3

12

请记住,由于a[b]与 相同*(a + b),因此每当您索引数组时都会进行隐式添加。这意味着这&a[b]a + b因为地址和取消引用运算符取消了。

然后,使用cset to 0,我们可以替换:

&(&c[a])[b] = &(&*(0 + a))[b] = &(a)[b] = &a[b] = &*(a + b) = a + b

我不确定这是明确定义和可移植的,但我想它可以在大多数“典型”系统上运行。

于 2013-11-08T08:13:49.383 回答
7

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

c是一个指向NULLor的指针,0并且您获取偏移量&0[a],这正是a,然后您获取来自 的偏移量[b]&0[a]0+a+b.

这就是所有的魔法。

于 2013-11-08T08:15:15.767 回答
3

这只是导致加法的指针的加法。

去理解它

 &c[a]  = c + a;

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

当你拿走&(&c[a])[b],它就会给c + a + b。因为 c 为 0,所以它是a+b

实际上,要在没有+运算符的情况下对两个整数求和,请使用按位运算符和全加器电路中使用的逻辑。

于 2013-11-08T08:18:25.743 回答