簡単な質問。For-Loopカウンタは保持されますか?
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
これは "i is 5"と出力されますか?
i
が保持されているか、ループの後でi
の値が未定義ですか?
簡単な質問。For-Loopカウンタは保持されますか?
int i;
for(i=0 ; i<5 ; i++){
//Something...
}
printf("i is %d\n", i);
これは "i is 5"と出力されますか?
i
が保持されているか、ループの後でi
の値が未定義ですか?
はい。私がforループの外で宣言されていれば、ループが終了した後もスコープ内に残ります。ループが終了した時点での値を保持します。
あなたがループ内でIをdeclatred場合:
for (int i = 0 ; i < 5 ; i++)
{
}
を、私はループ終了後に定義されていません。
変数iはループの範囲外で定義されています(これは素晴らしいです、またはその場合は印刷できません)。
ループの1回転ごとに終了後条件が「5以上になると停止する」の後にicnrementedされます。
したがって、私はこの時点で私が5に等しいことは本当に理にかなっています。
ブロックスコープはCの関数スコープとまったく同じではありません。変数iは、ループのスコープから外れたときに前の値に魔法のように「戻ってきません」。
i
あなたのループの後の値は5になります。あなたが何かをしていない限り、
i = 50000;
の中にそれを入れてください。
私が今まで読んだことのあるほとんどのコーディング標準でループを終了した後、 "i"を使用することは一般的には推奨されます。特にそうしないでください:
for(i = 0; i < num_elements; i++)
{
if(element[i].id == id)
{
/* Do something to element here. */
break;
}
}
if(i == num_elements)
{
fprintf(stderr, "Failed to find element %d.", id);
succeeded == false;
}
これは動作しませんが、コーディングが悪いです。これは、選択肢よりも読みにくく、保守が容易ではありません。例えば。
succeeded = false;
for(i = 0; i < num_elements; i++)
{
if(element[i].id == id)
{
/* Do something to element here. */
succeeded = true;
break;
}
}
if(false == succeeded)
{
fprintf(stderr, "Failed to find element %d.", id);
}
はい、変数は宣言されたブロック内でのみ有効です。
gcc ex.c
ex.c: In function ‘main’:
ex.c:10: error: ‘x’ undeclared (first use in this function)
ex.c:10: error: (Each undeclared identifier is reported only once
ex.c:10: error: for each function it appears in.)
のErr、何が:コンパイラだ
: ここでは例ですか?彼は「Aは事件かBだ」と尋ねた。そのような質問は、単に「はい」または「いいえ」と答えても満足できません。また、彼はブロックの外で彼の変数を宣言した。私は、この回答が関連性があるか、必要でない(以前の回答にまだ含まれていない新しい情報を追加しないので)。 – AlastairG
ええ、そうです。誰かが私がなぜ保存されているのかをすでに説明しているので、私は単に「はい」と答えるだけです(Visageの回答は最高でした)。私はこの例を追加すると、他の答えを完成させるのに役立つだろうと思った。 =) – BlackBear