int main()
{
int value = 4321;
int *ptrVal = &value;
printf("%d %d",++value,(*(int*)ptrVal)--);
return 0;
}
上記の print ステートメントでプリインクリメント/ポストインクリメントはどのように機能しますか?
そして、なぜ答えは 4321 4321 なのですか?
int main()
{
int value = 4321;
int *ptrVal = &value;
printf("%d %d",++value,(*(int*)ptrVal)--);
return 0;
}
上記の print ステートメントでプリインクリメント/ポストインクリメントはどのように機能しますか?
そして、なぜ答えは 4321 4321 なのですか?
value
2 つのシーケンス ポイント間でオブジェクトを 2 回変更しています。未定義の動作を呼び出しています。未定義の動作は、プログラムが print 4321 4321
、 print 42
、または単にクラッシュする可能性があることを意味します。
プログラムの正しいバージョンは次のようになります。
int value = 4321;
int *ptrVal = &value;
++value;
(*ptrVal)--; // no need to cast to int *
printf("%d %d", value, *ptrVal); // same as printf("%d %d", value, value);
もちろん、これを実現するために一時的なポインターは必要ありません。
上記のコードは単に壊れています。それがどのように機能するか、または答えがどうなるかは特定されていません。変更または変更とアクセスの間にシーケンス ポイントが必要です。