谁能解释一下这个特定的print语句在for循环中做了什么?

sa_*_*nyc 3 c++ arrays

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)

瞧.搞抄写这个废话的程序员.

  • 还要注意,它只有在表的第一个元素等于1时才有效.`(a - i)[i]`写得很清楚是`a [i - i]`=`a [0]`= 1 (在这种情况下).无论如何,我会判断编程人员编写此代码,以便从软盘安装Windows 7,至少十次. (7认同)
  • +1仅用于最后一句.如果可以的话,我会再次给出好的解释. (3认同)