3
int a[] = { 1, 2, 3, 4, 5 };
const int N = sizeof(a)/sizeof(a[0]);
cout<<N<<endl;

for (int i = 0; i < N; ++i)
{
    cout << (i[a-i]%N)[a+i-1] << " ";
}

//它打印 1 2 3 4 5 即我不理解的数组是 cout << (i[ai]%N)[a+i-1] << " ";

4

1 回答 1

15

这就是 CBCPAT,令人困惑但正确的指针算术技巧。

由于 C++(和 C)中的数组订阅是使用指针算术完成的,如果a是一个数组并且i是索引(一个整数),那么

a[i]

相当于

*(a + i)

并且由于加法是可交换的,这与

*(i + a)

这又可以写成

i[a]

即你用数组索引整数(WTH?)。

了解了这一点后,您可以轻松地重写代码以了解它的作用:它等效于

(a + i - 1)[(a - i)[i] % N]

这只是

(a + i - 1)[1 % N]

反过来

(a + i - 1)[1 % 5],

那是

*(a + i - 1 + 1)

这是

a[i]

瞧。搞砸写这个废话的程序员。

于 2013-02-15T05:56:01.787 回答