2017-01-28 5 views
-8

私はCプログラムを持っています。しかし、私はこのプログラムの出力を理解することはできません。静的変数がcでどのように動作するか

int main(){ 
    int i=2; 
    for(i=0;i<=3;i++){ 
     static int i; 
     i=i+8; 
    } 

    printf("%d",i); 
} 

誰かが理由を説明することができます私は、出力が8であるべきと考えているが、実際の出力は4

のですか?

+1

int main(){ int outside_i=2; for(outside_i=0;outside_i<=3;outside_i++){ ; // do stuff that does not affect outside_i } printf("%d",outside_i); } 

、さらなる簡素化に? – WhozCraig

+0

内部変数 'i'が' static'であることは、ここにはありません。これは、あなたが印刷している外側スコープの変数 'i'です(ループ変数のために使用します)。 –

+0

異なる変数名を使って試してみてください –

答えて

5

int i = 2;は、mainの内部にiという名前の変数を定義します。 static int i;はという変数を定義しています。の内部にはというループがあります。ループの終了後、その変数はもう表示されません。したがって、行printf("%d", i);では、名前iは、ループの内部で定義されたものではなく、関数の先頭に定義されたiを参照します。

ループ本体の内部では、i=i+8;という行は、ループ本体の内部に定義されているiを参照しています。したがって、printf行がループを終了する}の前に来た場合、その変数の値が表示されます。しかし、その値は8ではありません。それを試してみてください。

4

printf関数がローカル変数iの値を出力するためです。 スコープ内のスコープはforです。

すると、ローカル変数iは4 < = 3その後、条件と印刷i4なります。流れる流れの中

内部コンパイラの仕事:

local i   condition  static i    operation 

i = 0   0 <= 3(true)  i = 0   i = 0(static) + 8 

i = 1   1 <= 3(true)  i = 8   i = 8(static) + 8 

i = 2   2 <= 3(true)  i = 16   i = 16(static) + 8 

i = 3   3 <= 3(true)  i = 24   i = 24(static) + 8 

i = 4   4 <= 3(false) 

はその後i = 4を印刷します。

3

iforループの内側にあるので、もう一方のiを明瞭にするために、別の名前を使用して書き直しましょう。

int main(){ 
    // int i=2; 
    int outside_i=2; 
    // for(i=0;i<=3;i++){ 
    for(outside_i=0;outside_i<=3;outside_i++){ 
     // static int i; 
     static int inside_i; 
     // i=i+8; 
     inside_i=inside_i+8; 
    } 
    // printf("%d",i); 
    printf("%d",outside_i); 
} 

これはあなたのループを壊した何の条件

int main(){ 
    int outside_i; 
    outside_i=0; 
    outside_i++; 
    outside_i++; 
    outside_i++; 
    outside_i++; 
    printf("%d",outside_i); 
} 
関連する問題