2010-12-30 4 views
1

「x」の値を何回返しますか次のコードスニペットに記載されていますか?私にfor-loopsの疑いがありません

int x; 
for(x=0;x < 10; x++) 
    printf("%d",x); 

答えがているようだが、私のモジュールは、であると言います?!私は何が欠けていますか?

+0

デバッガはあなたの友だちです –

+0

@Ed Swangren:私はデバッガの使い方についてあまり気づいていません:(私はこの点に関してさらに助けてくれます:) – Quixotic

+1

「テスト済み」とはどういう意味ですか? 「私のモジュールはそれが10だと言っています」とはどういう意味ですか? –

答えて

8

イレブン、printf関数が呼び出される前の状態を、各ループ反復のを開始で試験される:

0 < 10 == true 
1 < 10 == true 
2 < 10 == true 
3 < 10 == true 
4 < 10 == true 
5 < 10 == true 
6 < 10 == true 
7 < 10 == true 
8 < 10 == true 
9 < 10 == true 
10 < 10 == false // exit from loop (printf not executed) 
+0

+1、それは素晴らしいですが、私の戦略は$ x <1 $ = 2と$ x <2 $ = 3、$ x Quixotic

3

ループはx <の場合にのみ実行されるため、xはすべて0〜9ではなく0〜10の値です。 10〜0の値があるため、ループは10回実行されます。

あなたが比較について話しているのなら、それはテスト11回です。モジュールが正しくありません。

+0

ええ、あなたがコメントしてから約5秒後に追加されました。 : – Will

+0

私は-1を削除します: – Quixotic

0

10倍 -

  1. 割り当て0 X
  2. にx <が真であるかどうかを確認し、そうでない場合は6にします。
  3. 実行ループのボディ
  4. ループ

後2

  • コードに
  • インクリメントX
  • ゴーあなたがそれを通過した場合は第十一時間ループ条件が偽になるので、あなたは、ループ本体は10回呼び出されてで終わります体は決して実行されません。

  • +0

    -1:私の質問を確認してください。答えを編集して-1を削除してください。 – Quixotic

    +1

    私の答えは多かれ少なかった。私は「テスト済み」の部分を上書きしてしまいました。「10」は間違っている可能性がありますが、あなたがちょうどそれを下落させたと言っているのではなく、将来あなたに応答します。 –

    +1

    あなたの質問についてのポイントは、forループの仕組みを知らないように見えるということです。私の答えはそれを説明しています。 –

    0

    はい、x < 10の式は11回評価されます。最初の10回は真で、最後の時間は偽です(x==10のため)。

    1

    0-9の10個の値がありますが、がテストされます 11回、最後の時間がループを終了してfalseを返します。

    1

    はい。 TESTは11回、ボディは10回だけ実行されます。

    1
    for(x=0;x < 10; x++) 
    

    Xはゼロから始まりますが、xが10未満である間、あなたのコードがループするので、それはので、ここでこの問題を解決するために9で終了すると、いくつかのソリューションです:

    for(x=0;x <= 10; x++) 
    

    for(x=0;x < 11; x++) 
    

    これらは両方とも11

    2

    になります。デバッガに慣れていない場合は、

    あなたは、物事に正しい方法を行うと、プロセスでデバッグソフトウェアに学ぶ、 thisを読むことから始めたい場合

    testing 0 
    0 
    testing 1 
    1 
    testing 2 
    2 
    testing 3 
    3 
    testing 4 
    4 
    testing 5 
    5 
    testing 6 
    6 
    testing 7 
    7 
    testing 8 
    8 
    testing 9 
    9 
    testing 10 
    

    を印刷し

    int main() { 
        int x; 
        for(x=0;(printf("testing %d\n", x) || 1) && (x < 10); x++) 
         printf("%d\n",x); 
        return 0; 
    } 
    

    上記のコードを使用したgdbセッションです。ループテストラインに何回ヒットするかを数えます。それは11です。

    $ gdb loop 
    GNU gdb (GDB) 7.0.1-debian 
    Copyright (C) 2009 Free Software Foundation, Inc. 
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
    This is free software: you are free to change and redistribute it. 
    There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
    and "show warranty" for details. 
    This GDB was configured as "x86_64-linux-gnu". 
    For bug reporting instructions, please see: 
    <http://www.gnu.org/software/gdb/bugs/>... 
    Reading symbols from /home/nathan/c/loop...done. 
    (gdb) break 6 
    Breakpoint 1 at 0x4004ec: file loop.c, line 6. 
    (gdb) run 
    Starting program: /home/nathan/c/loop 
    
    Breakpoint 1, main() at loop.c:6 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) n 
    testing 0 
    7    printf("%d\n",x); 
    (gdb) 
    0 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 1 
    7    printf("%d\n",x); 
    (gdb) 
    1 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 2 
    7     printf("%d\n",x); 
    (gdb) 
    2 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 3 
    7    printf("%d\n",x); 
    (gdb) 
    3 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 4 
    7    printf("%d\n",x); 
    (gdb) 
    4 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 5 
    7    printf("%d\n",x); 
    (gdb) 
    5 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 6 
    7    printf("%d\n",x); 
    (gdb) 
    6 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 7 
    7    printf("%d\n",x); 
    (gdb) 
    7 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 8 
    7    printf("%d\n",x); 
    (gdb) 
    8 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 9 
    7    printf("%d\n",x); 
    (gdb) 
    9 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 10 
    8   return 0; 
    (gdb) 
    9  } 
    
    +0

    +1 Lol!実際にこれはいいですが、今のところ私は数学的なアプローチに満足している方がよいでしょう:) – Quixotic

    0

    あなたは本当ですか?これは直感的でなければなりません!

    xは(nが10である)n+1回、をテストされていますが、<演算子*を使用しているだけので、条件が満たされているn回!

    効果を確認する:xは、1つのより多くの時間テストされていることを示し、最後のprint文

    int x; 
    for(x=0;x < 10; x++) 
        printf("%d",x); 
    printf("%d",x); 
    

    をする必要があり、出力10(私たちはゼロからスタートしているので、xは実際に11回試験されます)。

    +0

    最後の印刷ステートメントは実際には10を出力します:P – Muggen

    +0

    はい、私はそれが<=または他の何かの理由のために<誘導ロジックがうまくいくでしょう... – Quixotic

    +0

    @Muggen、あなたはワシの目を持っています!私はそれが些細だと思ったのでコードをテストしなかったが、明らかに私は間違いを訂正のために感謝した:) –

    2

    あなたの質問が式x < 10の何回評価されたかについては、答えは - それに依存します。コンパイラの最適化に依存します。コンパイラが素朴なコードを生成した場合、それは11回評価されます。コンパイラがループを完全に展開すると、答えは0になります。間にあるものも可能です。

    0

    これは通常、インタビューの質問で尋ねられる脳のお誘いです。簡単なチェック方法は、ベースケースを10から1に変更することです。

    for(x = 0; x < 1; x ++)printf( "%d"、x);

    1回印刷されます。 x = 1のときは、ループから抜け出し、forループの内容には含まれません。したがって、「x + 1」回ではなく「x」回印刷されます。

    また、あなたもこれを行うこととしてそれについて考えることができますため (X = 1; X < 2; X ++)

    それはときのx = 1ループの内容を実行しますが、ないのx = 2または( 2 - 1)回。 覚えておくべき重要なことは、実際にループから抜け出し、xのどの値がループの内容内で実行されるかということです。

    1

    よろしくお願いします。forループ

    ザ・は次のようになります。

    loop

    これは、条件がテストされていることを示します:最初の繰り返しの前に

    • 各反復の後に。

    したがって、10回のインターレーションで11回のテストが行​​われます。シンプル!

    関連する問題