0
int i;
while(i=10)
{
    printf("%d\n",i);
    i=i+1;
}

while(i=10) が while(1) を意味するプログラムがあります [通常] while ループが true であることを意味します。したがって、10 を一度だけ出力し、i の値を 1 ずつインクリメントする必要があります。つまり、i は 11 になります。しかし、出力は無限に '10' を繰り返し印刷するのはなぜですか? 私のプラットフォームは: 64 ビット Windows 7 で、32 ビット Dev C++ コンパイラで動作しています。

4

6 に答える 6

8

while 条件で単一の等号 (代入) の代わりに二重の等号 (比較) を使用したいと思います。また、変数 i を 10 に初期化する必要があります (そうしないと、while ブロックが実行されません)。

int i=10;
while (i==10)
{
    printf("%d\n",i);
    i=i+1;
}
于 2012-12-04T10:04:07.000 に答える
5

while ループを参照してください。

while(i=10) // assigns the value 10 to the i which is always true (becuase any non-zero value is true in such a case).

あなたが使用したのはassignment operator =、この代入によって返される値が常に true になる 値でrvalueあることです。1010

だから無限ループ。

while ループ内でwhile(i == 10)orまたは任意の比較演算子を使用する必要があります。while(i < = 10)

比較演算子の結果は1(true) または0(false) になります。inwhile(cond) condが false の場合、ループは終了します。

于 2012-12-04T09:53:51.703 に答える
2

while(i=10)に設定i10、それをチェックします。つまり、trueまたはに変換しfalseます。のみ0になるfalseため、これはtrue毎回になり、永久にループします。

私はあなたがしたいと思いますwhile(i==10)。Double=は「等しいかどうかをチェックする」という意味です。シングル=は「値を設定する」ことを意味します。

編集:実際、あなたが何を望んでいるのかよくわかりません。iループの前に初期化していない場合は、条件に設定するつもりだった可能性があります。その場合、なぜ10毎回設定されることに驚いていますか?

もう一度編集してください:わかりました。あなたのコメントは、条件に設定することを意味します。したがって、その条件がどのように機能するかを理解する必要があります。あなたが書いたものは事実上これです:

while ( (bool)(i=10) )

これは に設定iされ、常に である に10変換10されます。その後、ループ内でにインクリメントされます。その後、ループの先頭に戻ると、すぐに に戻ります。だからあなたは効果的にやっています:booltruei11i10

set i to 10; <-----\
print i (=> 10);    |
set i to 11;        |
go back to the top; /
于 2012-12-04T09:54:16.623 に答える
2

iwhile 条件セクションでは、比較を行うのではなく、値を割り当てています

 while(i=10)

このようなタイプのエラーは、プログラムが正常にコンパイルされるため追跡が困難です。このようなエラーを回避するには、の順序で比較を行います

while(10==i) or if(10==x)など

を誤って使用した場合while(10=i)、コンパイラは次のようなエラーをスローします

The left-hand side of an assignment must be a variable, property or indexer

後でデバッグする貴重な時間を節約できます。

于 2012-12-04T10:17:19.440 に答える
1

あなたが見逃している重要なことは、条件ステートメントがループの反復ごとに実行されることだと思います。したがってi=10、最初の反復だけでなく、ループの反復ごとに実行されます(そして結果の参照はゼロに対してテストされます)。

あなたのコードはこれと同等です:

int i;
int j = (i=10);
while(j)
{
    printf("%d\n",i);
    i=i+1;
    j = (i=10);
}

ここj = (i=10);ではと同等i = 10; j = i;です。

したがって、手順は次のようになります。

  1. に割り当て、結果の参照()の値10をに割り当てます(割り当ては、慣例により参照またはポインターを返します)。 iij
  2. 値がtrueの場合(常にtrue)、ループブロックを実行します
    1. 電話printf
    2. インクリメントi
    3. に割り当て、結果の参照()の値10をに割り当てます。 iij

割り当てをテストするwhileループは、割り当てから返された値がゼロの場合にのみループを失敗/停止できます。

while(i==10)実際には、このようなループを作成するのは、非常に一般的な等価性チェックに非常に似ているため、悪いスタイルです。のように、オブジェクトが使用されているときに割り当ての戻り値がテストされることがあります。これは、nullポインタを返すwhile(nextObjPtr = collection.getNextObj())とすぐに失敗するためです。getNextObjただし、それでも、より明確に明示的に記述されます。

while((nextObjPtr = collection.getNextObj()) != nullptr)

またはC++11より前:

while((nextObjPtr = collection.getNextObj()) != NULL)
于 2012-12-04T10:08:16.267 に答える
0
  while(i=10)

条件がおかしい!実は条件じゃない!

あなたは書くべきです

while(i<10)
于 2012-12-04T09:54:40.117 に答える