以下是summation逻辑,它不使用+
运算符执行添加,如下所示
int add(int a, int b) {
const char *c=0;
return &(&c[a])[b];
}
任何人都可以让我了解return
语句如何加入a
& b
。
答案 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
是指向NULL
或0
的指针,您获取的偏移量&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
。
实际上,要获得两个不带+
运算符的整数的求和,请使用按位运算符和全加器电路中使用的逻辑。