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