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] << " ";
}
Run Code Online (Sandbox Code Playgroud)
//它打印1 2 3 4 5,即我不理解的数组是cout <<(i [ai]%N)[a + i-1] <<"";
小智 15
这是CBCPAT,令人困惑但正确的指针算术技巧.
因为C++(和C)中的数组预订是使用指针算法完成的,如果a是数组并且i是索引(整数),那么
a[i]
Run Code Online (Sandbox Code Playgroud)
相当于
*(a + i)
Run Code Online (Sandbox Code Playgroud)
因为加法是可交换的,所以这是相同的
*(i + a)
Run Code Online (Sandbox Code Playgroud)
反过来可以写成
i[a]
Run Code Online (Sandbox Code Playgroud)
即你是用数组索引整数(WTH?).
在了解了这一点后,您可以轻松地重写代码以了解它的作用:它等同于
(a + i - 1)[(a - i)[i] % N]
Run Code Online (Sandbox Code Playgroud)
这只是
(a + i - 1)[1 % N]
Run Code Online (Sandbox Code Playgroud)
反过来
(a + i - 1)[1 % 5],
Run Code Online (Sandbox Code Playgroud)
那是
*(a + i - 1 + 1)
Run Code Online (Sandbox Code Playgroud)
是的
a[i]
Run Code Online (Sandbox Code Playgroud)
瞧.搞抄写这个废话的程序员.