0
++*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、次に逆参照してから逆参照された値を増やす必要があります。間違っていますか?

ここに画像の説明を入力

4

2 に答える 2