次のコードでは、2
が出力されます。C/C++での静的スコープ
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
Cで静的スコープがあるとどうなりますか? 1
はなぜ印刷されないのですか?
この場合の2
の印刷は動的スコープではありませんか?
静的スコープでは、最も近いxを関数定義に取るべきだと思いました。
次のコードでは、2
が出力されます。C/C++での静的スコープ
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
Cで静的スコープがあるとどうなりますか? 1
はなぜ印刷されないのですか?
この場合の2
の印刷は動的スコープではありませんか?
静的スコープでは、最も近いxを関数定義に取るべきだと思いました。
x
が最も近似しますが、x
の1つしかないので、実際には問題になりません。
あなたは
int x = 1;
int f(int y)
{
return x ;
}
int main() {
int x=2;
printf("%d", f(0));
}
にコードを変更した場合ので、あなたは、世界的な1とあなたが1
が印刷さばかりが表示されますmain
にローカルのものを2 x
を持っています。
あなたがないを持っているので、スコープがここに議論の余地あるがそうでないがグローバルx
を陰にしたであろうローカルx
を宣言しました。
2
が印刷されます。
x
はf
がパラメータ0
で呼び出される直前に2
からmain
に割り当てられています。
(main
が入力される前に、概念的にint x = 1;
が走っている。)
これは、コンパイラがアセンブリ/マシン・コードを生成する方法です。
したがって、メイン関数のスコープに別のXが必要な場合は、nwpの回答のように新しいオブジェクトを作成しておく必要があります。
"nwpの回答のように新しいオブジェクトを作ったはずです。"これは@nwpのコードで何が起こるかではなく、世界で最悪のコンパイラを使用していることが少なくなります。 – George
@george:本当ですが、質問の単純さを見て、コンパイラの詳細を詳述したくありませんでした;) – JHBonarius
最後の行から、printf( "%d"、f(x) )); 'は2を出力します< - 明らかに変数を2回初期化することはできませんので、ちょっとだけ明確にするとよいでしょうか?あなたまで、あなたはまだ私の投票をすることができます:) – George
これらは通常、動的でという語彙スコープと呼ばれます。
レキシカルスコープは、コンパイル時に、実行時に動的スコープで完全に決定されます。
"x"という名前の変数が1つしかないため、スコープはプログラムとは無関係です。
ここスコープ規則に応じて異なるだろうプログラムです:レキシカルスコープの下で
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
、辞書的に「最も近い」ですx
の値を返すf
- グローバル一つは。
したがって、0
と表示されます。
動的スコープでは、f
は、main
の1つである最新のx
の値を返します。
したがって、1
が印刷されます。
ここでは、(グローバル変数として)ただ一つの 'x'を宣言します。したがって、コードのどこからでも行われた変更は、コードの他の場所からの後の使用に影響を与えます。 – NiBZ
なぜでしょうか? xは定数ではなく、返される前に変更されます。 – George
これは最も近いものを取っていますが(ただし、どちらか一方しか選択できません)、関数呼び出しの前に代入が行われます。したがって、2が印刷されます。意図したとおりに動作します。 – Borgleader