2017-05-16 11 views
0

私はこのプログラムの下に出くわしました。私は出力を理解していません。Cの割り当てと条件付きチェック

誰かが光を当ててもらえますか?

#include <stdio.h> 

int main() 
{ 
    int i=1,j=1; 
    for(;j;printf("%d %d\n",i,j)) 
    j=i++ <=5; 
    return 0; 
} 

その出力は次のとおりです。

2 1 
3 1 
4 1 
5 1 
6 1 
7 0 
+3

Fyi、これをデバッガで*ショート*プログラムすると、その動作に関する情報の小説が表示されます。デバッガは何かがどのように壊れているかを理解するだけでなく、何かが動作する方法を理解するのに非常に強力です。 – WhozCraig

答えて

4
#include <stdio.h> 

int main() 
{ 
    int i=1,j=1; 

    //for(initialisation; condition; operations) 
    // here no initialisation, 
    // 1. condition is j, if j is true 
    // 2. then it will execute block statements 
    // 3. then finally it execute operations, here printf 
    // 4. again check step 1. 

    for(;j;printf("%d %d\n",i,j)) 
    j=i++ <=5; // j = (i <= 5); i++; 
    return 0; 
} 

#include <stdio.h> 
int main() 
{ 
    int i=1,j=1; 
    while(j) { 
    j = (i++ <=5); 
    printf("%d %d\n",i,j); 
    } 
    return 0; 
} 
2

を次のようにアジャイは、元の1(I」の代替コードを与えてきたようにあなたの質問を簡略化することができます便宜上下にコピー&ペーストしてください)

#include <stdio.h> 

int main() 
{ 
    int i=1,j=1; 
    while(j) { 
    j = (i++ <=5); 
    printf("%d %d\n",i,j); 
    } 
    return 0; 
} 

それでは、whileループ

の実行を見てみましょうI = 1、J = 1、jはループで、Trueで、J =(1 < = 5)真= = 1、I = 2 (ポストインクリメント)。 i = 2、j = 1、jはループ内で真、j =(2 < = 5)=真= 1、i = 3(ポストインクリメント)。 i = 3、j = 1、jはループ内で真、j =(3 < = 5)=真= 1、i = 4(ポストインクリメント)。

I = 4、J = 1、jはループで、真、J =(4 < = 5)がtrue = = 1、I = 5(ポストインクリメント)

I = 5、J = 1 、j = True、1、i = 6(ポストインクリメント)、j =(5 < = 5)= true = 1 i = 6、j = 1、jはループ内で真、j =(6 < = 5)=偽= 0、i = 7(ポストインクリメント)。

i = 7、j = 0、jはループ外です。

プログラムが停止します。

この実行の説明が役立つことを願います。

1

次の文:

j=i++ <=5; 

がそれをインクリメントする前に、変数iの値を評価します。この評価値は比較<= 5で使用されます。比較の結果は、条件がまたはであるかどうかによって、0または1のいずれかになります。この場合

、それは二つの別々のステートメントでそれを書くのと同じ効果があります:forループの

j = i <= 5; 
++i; 
+0

比較演算子 '<='は、assigment演算子 '='よりも優先順位が高いことに注意してください。したがって、割り当ては割り当て前に行われます。 –

1

構文:

for (initialization Statement; check condition; increment/decrements operation) 
{ 
     // codes 
} 

初期化ステートメントは一度だけ実行されます。次に、チェック条件が評価されます()。条件が(ゼロ以外)の場合、forループ本体のコードが実行され、更新式が更新されます。条件がfalse(0)の場合、forループが終了します。あなたのコードで

j = 1

は、条件がになって、forループ本体に入ります。次に、 j = i++ <= 5 = trueをチェックし、制御は
部分の 増分/減分になり、i = 2j = 1と表示されます。

次に、テスト条件がになるまで再度コードを繰り返します。

1

同じことが、このように表現することができます:ここ

#include <stdio.h> 
int main() 
{ 
    int i,j; 
    for(i=1,j=1;j!=0;){ 
    j=i++ <=5; 
    printf("%d %d\n",i,j); 
    } 
    return 0; 
} 

forループの慣例に従って。

  1. & jはj != 0
  2. i <= 5かどうか1つの
  3. チェック状態に初期化されるIのでjは1 & &まま私は
  4. プリント再びi = 2, j =1
  5. i <= 5ので、J(インクリメント後)2となります残っている1 & & iが3になる(インクリメント後)
  6. 枚のプリント再びi = 3, j =1
  7. i <= 5そうjはiが4(インクリメント後)
  8. プリントi = 4, j =1
  9. なり、これは上に行く1 & &まま、それはjはiがより大きくなると、それは激しい条件として、0となります5
関連する問題