コード:
int a = 5;
int *ptr;
ptr = &a;
printf("%d",*ptr);
printf("\n%d",*(ptr++));
printf("\n%d",(*ptr)++);
printf("\n%d",++(*ptr));
出力:
5
5
1638268
1638268
そして、出力が次のようになることを期待しています。この単純な出力を理解できません。
コード:
int a = 5;
int *ptr;
ptr = &a;
printf("%d",*ptr);
printf("\n%d",*(ptr++));
printf("\n%d",(*ptr)++);
printf("\n%d",++(*ptr));
出力:
5
5
1638268
1638268
そして、出力が次のようになることを期待しています。この単純な出力を理解できません。
++
2 番目を期待どおりに動作させてジャンクを出力する場合は、代わりにプレフィックスを使用できます
int a = 5;
int *ptr;
ptr = &a;
printf("%d",*ptr); // 5 as you expected.
printf("\n%d",*(ptr++)); // 5, because the pointer is incremented after this line
printf("\n%d",(*ptr)++); // Not 5 because pointer points to another location.
printf("\n%d",++(*ptr)); // Pointer already changed, no longer pointing at 5.
int a = 5;
int *ptr;
ptr = &a; // ptr is the address of the int 5
printf("%d",*ptr); // dereferences ptr, which points to in 5
printf("\n%d",*(ptr++)); // increments ptr by one, so ptr not points to
// an int one over from wherever int 5 is in memory
// but return ptr before incrementing and then dereference it
// giving int 5
printf("\n%d",(*ptr)++); // dereference ptr, which is now one int over from 5 thanks
// to the last line, which is garbage, try
// to increment garbage by 1 after printing
printf("\n%d",++(*ptr)); // dereference ptr, which is now one int over from 5,
// try to increment garbage by one before printing
*ptr
の値に他ならない場所の値を与えるだけですa
。
*(ptr++)
と同等で(*ptr)
あり(ptr += 1)
、ポストインクリメントのため、最初に printf で使用される値を提供し、次にポインターをインクリメントして、今は jump memory を指しています。
(*ptr)++
(*ptr)
はand thenと同等な(*ptr += 1)
ので、ジャンク メモリの値を取得してインクリメントします。
++(*ptr)
(*ptr) += 1
ジャンクの場所で値をインクリメントするの と同等です。これでundefined behavior
、最後にインクリメントされた値に 1 を加えた値を取得せず、未定義の動作のために最後の値と同じ値を取得するという効果を確認できます。私のコンパイラでは、最後にインクリメントされた値に 1 を加えた値を取得しました。