5

異なる条件の for ループで 2 つの変数を使用するとi<3,j<2、for ループの下で使用したような 2 つの条件は、2 番目の条件が失敗するまで常に実行されます。

#include<iostream>
#include<conio.h>
using namespace std ;
int main()
{
int i,j ;
for(i=0,j=0;i<3,j<2;i++,j++)
{
    cout<<"hello" ;
}
getch() ;
return 0 ;
} 

そのコードでhelloは、2回印刷されます。なんで?

を使用するi<3,j<10と、「こんにちは」が10回出力されます。なぜ最初の条件が無視されているのか理解できません。それはコンパイラに依存していますか、それとも何か他のものですか?

|| のような条件に置き換えると、すべてが正常に機能します。(OR) または &&(AND)。もう 1 つのことは、for ループ自体で i と j を初期化できないことです。エラーが表示されますが、C スタイルで変数を宣言するか、for ループの外で 1 つの変数を宣言すると正常に動作します。 、なぜそうなのですか?

私が使用したコンパイラは Orwell Dev C++ です。
前もって感謝します。

4

3 に答える 3

7

for(i=0,j=0;i<3,j<2;i++,j++)

と同等です

for(i=0,j=0;j<2;i++,j++)

コンマ式は、最後の式の値を取ります。

最初の条件は無視され、2 番目の条件のみが使用されます。

于 2013-10-05T05:47:38.867 に答える
7

forループは次のもので構成されます。

for(START_STATEMENT; CONDITION_EXPRESSION, LOOP_EXPRESSION) BODY_BLOCK

どこ:

  • START_STATEMENT変数宣言を含むことができる単一のステートメントです。2 つの変数を宣言する場合は、 と記述できますが、後者は実際には 2 つのステートメントであるため、int i=0, j=0そうではありません。int i=0; int j=0また、ノード、その変数宣言はステートメントの一部ですが、(サブ)の一部にすることはできません。そのため、int i=0, int j=0これも正しくありません。

  • CONDITION_EXPRESSIONブール値に評価される単一の式ですあなたの場合、次のセマンティクスを持つcoma演算子A, Bを使用しています:

    • Aを評価します(無視するだけでなく、評価します)
    • A の結果を捨てる
    • Bを評価する
    • 結果として B を返す

    あなたの場合:i<3,j<2を比較していますi<3、この比較の結果を無視しているだけです。

    コンマ式は、値を返すだけでなく、命令に副作用がある場合に役立ちます。一般的なケースは、変数のインクリメント/デクリメントまたは代入演算子です。

  • LOOP_EXPRESSION何にも評価される必要のない単一の式ですここでは、左辺の結果を無視して、カンマ式を再度使用しています。ただし、この場合、とにかく結果を使用しておらず、変数の値をインクリメントするという ++ 副作用を使用しているだけです。

  • BODY_BLOCK中括弧でカプセル化された単一のステートメントまたはブロックのいずれかです。

上記は次のforものと比較できます。

{
    START_STATEMENT;
    while(EXPRESSION) {
        BODY_BLOCK;
        LOOP_EXPRESSION;
    }
}
于 2013-10-05T07:11:53.730 に答える
-1

C コンパイラは常に 2 番目の条件を使用していました。

したがって、j<2 が使用されます。

これをループに使用します

      for(i=0,j=0;j<10;i++,j++)
于 2013-10-05T05:51:59.843 に答える