++*P--;
それは試験からの質問ですP
。配列内の任意の要素へのポインターである場合、このステートメントが実際に何をするかを説明してください。
それを評価するための簡単なコードも書きました。
int i;
int* array = calloc(10, sizeof(int));
for (i = 0; i < 10; i++) {
array[i] = i;
printf("%d,", array[i]);
}
int* P = array + 5;
printf("\n %p", P);
printf("\n %d", *P);
++*P--;
printf("\n %p", P);
printf("\n %d \n", *P);
for (i = 0; i < 10; i++) {
printf("%d,", array[i]);
}
しかし、出力は私をさらに混乱させます:
0,1,2,3,4,5,6,7,8,9,
0x100105534
5
0x100105530
4
0,1,2,3,4,6,6,7,8,9,
P
最初に を逆参照し、次にその値を増やしてから pointer の値を減らすように見えますP
が、なぜですか?
p53 の K&R 表 2-1 (下の図を参照) によると、++、 --、および * (逆参照) は、右から左に同じ優先順位と結合規則を持っています。したがって、最初のステップはの値を減らしP
、次に逆参照してから逆参照された値を増やす必要があります。間違っていますか?