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] << " ";
这就是 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]
瞧。搞砸写这个废话的程序员。