あなたが見逃している重要なことは、条件ステートメントがループの反復ごとに実行されることだと思います。したがって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;
です。
したがって、手順は次のようになります。
- に割り当て、結果の参照()の値
10
をに割り当てます(割り当ては、慣例により参照またはポインターを返します)。
i
i
j
- 値がtrueの場合(常にtrue)、ループブロックを実行します
- 電話
printf
- インクリメント
i
- に割り当て、結果の参照()の値
10
をに割り当てます。
i
i
j
割り当てをテストするwhileループは、割り当てから返された値がゼロの場合にのみループを失敗/停止できます。
while(i==10)
実際には、このようなループを作成するのは、非常に一般的な等価性チェックに非常に似ているため、悪いスタイルです。のように、オブジェクトが使用されているときに割り当ての戻り値がテストされることがあります。これは、nullポインタを返すwhile(nextObjPtr = collection.getNextObj())
とすぐに失敗するためです。getNextObj
ただし、それでも、より明確に明示的に記述されます。
while((nextObjPtr = collection.getNextObj()) != nullptr)
またはC++11より前:
while((nextObjPtr = collection.getNextObj()) != NULL)