私はCプログラムを持っています。しかし、私はこのプログラムの出力を理解することはできません。静的変数がcでどのように動作するか
int main(){
int i=2;
for(i=0;i<=3;i++){
static int i;
i=i+8;
}
printf("%d",i);
}
誰かが理由を説明することができます私は、出力が8であるべきと考えているが、実際の出力は4
のですか?
私はCプログラムを持っています。しかし、私はこのプログラムの出力を理解することはできません。静的変数がcでどのように動作するか
int main(){
int i=2;
for(i=0;i<=3;i++){
static int i;
i=i+8;
}
printf("%d",i);
}
誰かが理由を説明することができます私は、出力が8であるべきと考えているが、実際の出力は4
のですか?
int i = 2;
は、main
の内部にi
という名前の変数を定義します。 static int i;
はという変数を定義しています。の内部にはというループがあります。ループの終了後、その変数はもう表示されません。したがって、行printf("%d", i);
では、名前i
は、ループの内部で定義されたものではなく、関数の先頭に定義されたi
を参照します。
ループ本体の内部では、i=i+8;
という行は、ループ本体の内部に定義されているi
を参照しています。したがって、printf
行がループを終了する}
の前に来た場合、その変数の値が表示されます。しかし、その値は8ではありません。それを試してみてください。
printf
関数がローカル変数i
の値を出力するためです。 スコープ内のスコープはfor
です。
すると、ローカル変数i
は4 < = 3その後、条件偽と印刷i
値4
なります。流れる流れの中
内部コンパイラの仕事:
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
を印刷します。
i
がfor
ループの内側にあるので、もう一方の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);
}
に
、さらなる簡素化に? – WhozCraig
内部変数 'i'が' static'であることは、ここにはありません。これは、あなたが印刷している外側スコープの変数 'i'です(ループ変数のために使用します)。 –
異なる変数名を使って試してみてください –