这是在不使用运算符的情况下执行加法的求和逻辑,+
如下所示,
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
set to 0
,我们可以替换:
&(&c[a])[b] = &(&*(0 + a))[b] = &(a)[b] = &a[b] = &*(a + b) = a + b
我不确定这是明确定义和可移植的,但我想它可以在大多数“典型”系统上运行。
好吧,它并不像你想象的那么复杂,但你肯定不应该使用任何东西,因为它有点脏;)
c
是一个指向NULL
or的指针,0
并且您获取偏移量&0[a]
,这正是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
。
实际上,要在没有+
运算符的情况下对两个整数求和,请使用按位运算符和全加器电路中使用的逻辑。