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]

Voilà。このがらくたを書いたプログラマーをねじ込みます。

于 2013-02-15T05:56:01.787 に答える