誰かが私に、どの配列に対しても式ca[7] == 7[a]
が真である理由を説明できますか。
それが間違っている可能性がある場合はありますか
ウィキでx[i]が*(x + i)の構文糖衣であり、これは*(i + x)に等しく、これはi [x]であることがわかりましたが、これを正しく理解することはできません。
誰かが私に、どの配列に対しても式ca[7] == 7[a]
が真である理由を説明できますか。
それが間違っている可能性がある場合はありますか
ウィキでx[i]が*(x + i)の構文糖衣であり、これは*(i + x)に等しく、これはi [x]であることがわかりましたが、これを正しく理解することはできません。
a[7]
と同等*(a + 7)
です。7[a]
、と同等*(7 + a)
です。ポインタに整数を加算することは可換演算であるため、これでも同じ結果が得られます。
それが間違っている可能性がある場合はありますか
簡単な答えはノーです。単純なポインタ演算の場合、それは常に真になります。
長い答えは、反例を見つけるにはハックを使用する必要があるということです。これを行う1つの方法は、マクロを使用することです。
#include <stdio.h>
#define a 1+s
int main(void) {
char s[] = "1q2w3e4r5t6y";
int x = a[7];
int y = 7[a];
printf("%c %c\n", x, y);
return 0;
}
結果:
s 5
マクロ展開後、式が異なるため、結果は異なります:1+(s[7])
対7[1+s]
。
オンラインで見る:ideone
a [7]は*(a + 7)に変換され、7 [a]は*(7 + a)に変換されます。これは、同じ場所、つまり同じデータを参照します。
I have seen in wiki that x[i] is a syntactic sugar for *(x+i) and this is equal to *(i+x) and this is i[x], but I can not understand this properly.
シンプルpointer arithmetic
で足し算はcommutative
。(だから、理解するのに問題はないと思います)
これを参照してください...
a[7] == *(a+7) == *(7+a) == 7[a]
a+7
7+a
加算演算は可換であるためです。
したがってa[7] == 7[a]
、証明された