-3
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
 int n = 5;

 cout<< n++ <<" "<< ++n << " "<< n++;

 _getch();
 return 0;
}

このプログラムを Visual Studio で実行すると、出力は 7 8 5 になります。

コンパイラ依存だと思います。(間違っていたら訂正してください)しかし、それは 7 7 5 か 5 7 7 のどちらかであるべきではありませんか?

4

1 に答える 1

1

さまざまな n++ / ++n が実行されるシーケンスは、C 標準では定義されておらず、時間の経過とともに、またはターゲット マシンや最適化オプションによって変わる可能性があります。ただし、コンパイラは、アトミックな方法で n++ または ++n のそれぞれを実行するコードを作成する必要があると思います。そのため、Visual Studio が最後に n++ で始まるように見える場合 (結果の "5" からわかるように)、n++ を実行するかどうかに応じて、結果として 7 7 5 または 6 8 5 のいずれかを作成する必要があります。第 2 項として、前または中央の ++n。

しかし、G++ も 7 8 5 を生成します。アセンブリ コードを見ると、その理由は、G++ がすべてのインクリメントを厳密な順序で右から左に実行するだけでなく、後で "++n" を "n" にエイリアスするためと思われます。これは、次のコードからより明確に確認できます。

int n = 2;
cout << n++ << " " << ++n << " " << n++ << " " << ++n << " " << n++;

結果は6 7 4 7 2です。明らかに、 の場合、コンパイラはインクリメントの前に のn++「スナップショット」を作成しますが、 の場合、コンパイラは単にインクリメントを行い、後で cout に書き込まれるときに n の現在の値を使用します。n++n

もちろん、同じ値への 2 つのインクリメントの結果は未定義であるため、コンパイラの選択は完全に正当です。

于 2013-08-11T17:31:36.997 に答える