「x」の値を何回返しますか次のコードスニペットに記載されていますか?私にfor-loopsの疑いがありません
int x;
for(x=0;x < 10; x++)
printf("%d",x);
答えがているようだが、私のモジュールは、であると言います?!私は何が欠けていますか?
「x」の値を何回返しますか次のコードスニペットに記載されていますか?私にfor-loopsの疑いがありません
int x;
for(x=0;x < 10; x++)
printf("%d",x);
答えがているようだが、私のモジュールは、であると言います?!私は何が欠けていますか?
イレブン、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)
+1、それは素晴らしいですが、私の戦略は$ x <1 $ = 2と$ x <2 $ = 3、$ x
10倍 -
後2
-1:私の質問を確認してください。答えを編集して-1を削除してください。 – Quixotic
私の答えは多かれ少なかった。私は「テスト済み」の部分を上書きしてしまいました。「10」は間違っている可能性がありますが、あなたがちょうどそれを下落させたと言っているのではなく、将来あなたに応答します。 –
あなたの質問についてのポイントは、forループの仕組みを知らないように見えるということです。私の答えはそれを説明しています。 –
はい、x < 10
の式は11回評価されます。最初の10回は真で、最後の時間は偽です(x==10
のため)。
0-9の10個の値がありますが、がテストされます 11回、最後の時間がループを終了してfalseを返します。
はい。 TESTは11回、ボディは10回だけ実行されます。
for(x=0;x < 10; x++)
Xはゼロから始まりますが、xが10未満である間、あなたのコードがループするので、それはので、ここでこの問題を解決するために9で終了すると、いくつかのソリューションです:
for(x=0;x <= 10; x++)
と
for(x=0;x < 11; x++)
これらは両方とも11
になります。デバッガに慣れていない場合は、
あなたは、物事に正しい方法を行うと、プロセスでデバッグソフトウェアに学ぶ、 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 }
+1 Lol!実際にこれはいいですが、今のところ私は数学的なアプローチに満足している方がよいでしょう:) – Quixotic
あなたは本当ですか?これは直感的でなければなりません!
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回試験されます)。
あなたの質問が式x < 10
の何回評価されたかについては、答えは - それに依存します。コンパイラの最適化に依存します。コンパイラが素朴なコードを生成した場合、それは11回評価されます。コンパイラがループを完全に展開すると、答えは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のどの値がループの内容内で実行されるかということです。
よろしくお願いします。forループ
ザ・は次のようになります。
これは、条件がテストされていることを示します:最初の繰り返しの前に
したがって、10回のインターレーションで11回のテストが行われます。シンプル!
デバッガはあなたの友だちです –
@Ed Swangren:私はデバッガの使い方についてあまり気づいていません:(私はこの点に関してさらに助けてくれます:) – Quixotic
「テスト済み」とはどういう意味ですか? 「私のモジュールはそれが10だと言っています」とはどういう意味ですか? –