-1
int main()
{
    int value = 4321;
    int *ptrVal = &value;
    printf("%d %d",++value,(*(int*)ptrVal)--);
    return 0;
}

上記の print ステートメントでプリインクリメント/ポストインクリメントはどのように機能しますか?

そして、なぜ答えは 4321 4321 なのですか?

4

2 に答える 2

3

value2 つのシーケンス ポイント間でオブジェクトを 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);

もちろん、これを実現するために一時的なポインターは必要ありません。

于 2013-06-10T18:50:44.953 に答える
1

上記のコードは単に壊れています。それがどのように機能するか、または答えがどうなるかは特定されていません。変更または変更とアクセスの間にシーケンス ポイントが必要です。

于 2013-06-10T18:50:22.053 に答える