3

int ptr={10,20,30,40,50} はそれを理解します

print("%d", *ptr++);

このようなステートメントでは、演算子の評価は右から左に行われます。したがって、*ptr++ 最初++に評価され、次に評価さptr* ます。同じことを確認するために、プログラムを作成しました。

#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1++);
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

上記のプログラムの出力は、上記のロジックによって予想される演算子の優先順位とは異なります。私が得た出力は

q1 = 0x7ffffcff02e0
*q1++ = 10
q1 = 0x7ffffcff02e4
*q1++ = 20

しかし、私は期待していました

q1 = 0x7ffffcff02e0
*q1++ = 20
q1 = 0x7ffffcff02e4
*q1++ = 20

では、演算子の優先順位は右から左に発生しませんでしたか?それとも私の理解に何か問題がありますか?

アップデート

*(ptr ++)が実行されるようにこれらの括弧を前述のように配置しても、出力はここでは変更されません。新しいコードです。

#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*(q1++));// note the braces here *(q1++) so that () get evaluated 
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

結果は、あなたが言及したのと同じ中括弧の使用に注意してください。それでも出力は

q1 = 0x7fff043f2120
*q1++ = 10 <-- I expected *q1++ = 20//since I used braces ()
q1 = 0x7fff043f2124
*q1++ = 20

したがって、中括弧*(ptr ++)を使用した後でも、現在の行が実行された後も操作++が実行されていました。中括弧()は機能しませんでしたか?それとも、ポストインクリメントのものよりも優先権が与えられていませんでしたか?

4

4 に答える 4

7

いいえ、オペレーターは右から左に評価されません。順序を示す演算子優先順位テーブルがあります。

しかし、これはあなたが見ている行動の理由ではありません。その理由は、ポストインクリメント演算子を使用しているためです。つまり*q1++、ポインターではq1、加算の値で逆参照が発生します。

コードを読み取りに変更すると*(++q1)(プリインクリメント演算子)、期待どおりの動作が見られます。

于 2011-06-23T13:19:16.270 に答える
6

++右側は、評価される前の値を返します。

printf("*q1++ = %d\n",*q1++);

と同じです

printf("*q1++ = %d\n",*q1);
++q1;
于 2011-06-23T13:20:17.087 に答える
1

このステートメント*ptr++;は、ptrが最初に指す値を評価し、次にptrをインクリメントします。最初にインクリメントするには、を使用します*++ptr;

于 2011-06-23T13:20:35.027 に答える
1

変数名の++後に変数名を付けることは、定義上、式が評価された後にポインターが進められることを意味するポストインクリメント操作です。

x = * q ++;

と同じです:

x = *q;
++q;

プレインクリメントに相当するものは次のとおりです。

x = *++q;

これは次のようになります。

++q;
x = *q;
于 2011-06-23T13:24:07.210 に答える