3

Cの単純なforループコードの次の部分を理解するのはほとんど困難ではありません。

int j=20;
for(int i=0, j; i<=j ; i++, j--)     
    printf("i = %d and j = %d \n",i,j);                     

出力を次のように出力します

i=0 and j=2
i=1 and j=1

で始まりませんが、j=20印刷j=2してから停止する理由j=1

しかし、私がこのコードを使用するとき

int j=20;
for(int i=0, j=20; i<=j ; i++, j--)     
    printf("i = %d and j = %d \n",i,j);   

それは正しく始まります

i=0 and j=20 upto ... i=9 and j= 11

私が見逃しているものはありますか?

4

4 に答える 4

9

あなたは。forコンストラクトの内側でjを宣言すると、外側とは異なる値を持つ新しい(スコープされた)jが作成されます。初期化に失敗すると、割り当てられたときにたまたまメモリ内にあったがらくたを取得します。

このような変数は「自動」変数と呼ばれ、プログラムのスタックに割り当てられます。必要に応じて、より多くのスタックスペースが割り当てられます。それらがスコープ外になると(実際には関数が戻るとき)、それらをすべて元に戻すことによってクリーンアップされます。

自動ストレージの次のビットが必要になると、同じことが起こり、スタックに残っているビットパターンを新しい変数値として取得します。

于 2012-09-08T02:54:40.470 に答える
4

forループの最初の部分で行ったことに注意してくださいint i = 0, jこれは、forループに対してローカルjなスコープを持つという名前の変数を宣言することです。したがって、forループの前に宣言および定義されたものと、forループスコープ内で宣言および定義したものとの間に関係はありません。ループ内を参照すると、最も内側のブロックが参照されるため、ゼロに初期化すると、最初の出力が得られます。jjj

jまた、の値がゼロになるほど幸運であることに注意してください。これは自動変数であり、定義時にゼロになるとは限りません。

次のループでは、必要な出力が表示されます。これは、前にjforループ内で定義されたものが参照されているが、jローカルの値をforループに対してj外部の同じ値で初期化したためです(これは関係ありません)。 forループのj内側)、したがって、質問の2番目の出力が得られます。

于 2012-09-08T03:42:51.337 に答える
0

基本的に、これはforループ構文でよくある混乱です。あなたの場合に起こっていることは次のとおりです。

int i=0, j; //create 2 int variables - i (which is initialized to 0) and uninitialized j

これはに似ていfor(i,j; i<j; i++, j--)ます。ただし、基本的には、初期化されていない追加の変数が作成されますj

于 2012-09-08T03:02:40.277 に答える
0

この質問は1行のコードに関するものです。int i=0, j;行を入力すると、次のようになりint i = 0; int j; ます。ただし、を入力int i=0, j=20;すると、jが以前に定義されていない限り、エラーが発生します。 int i = 0; int j = 20;

于 2012-09-08T04:25:14.003 に答える