0

私のコードには、次のようなforループがあります。

for(unsigned int n=10; n > 1; --n)
{
  std::cout << n << std::endl;
}

私は出力を期待しています:

9、8、7、6、5、4、3、2、1

私が得た出力:

10、9、8、7、6、5、4、3、2

gnu / g ++を使用すると期待どおりの出力が得られますが、MSVC2010では得られません。

私は次のことを行うことで、そのループで期待される結果が得られることを知っています。

for(unsigned int n=9; n > 0; n--)
{
  std::cout << n << std::endl;
}

他の誰かがこの振る舞いをしますか、それとも私はどういうわけかある種の魔法のスイッチを誤って投げましたか?

4

2 に答える 2

1

そこには魔法はありません。デクリメントはループの最初の反復の後に発生します。forこれがループの仕組みです。それがであるかどうかは関係ありませn----n

于 2013-03-12T15:50:42.950 に答える
0

forループは(大まかに)[1]以下を使用して作成できwhileます。

for(A; B; C)
{
   content of loop;
}

になります:

A;
while(B)
{
  content of loop;
  C;
}

つまり、言い換えると、

unsigned int n=10;
while(n > 1)
{
  std::cout << n << std::endl;
  --n;
}

今、あなたはそれがしていることをしている理由をはっきりと見ることができます。

[1]もちろん、上記の「変換」では、変更の範囲がn変更されます。これは、コンパイラがループのコードを生成する方法を示すためのforものではなく、ループがどのように動作するかを説明するためのものです。

于 2013-03-12T15:55:14.510 に答える