2017-01-24 4 views
1

次のコードでは、2が出力されます。C/C++での静的スコープ

int x = 1; 
int f(int y) 
{ 
    return x; 
} 

int main() { 
    x = 2; 
    printf("%d", f(0)); 
} 

Cで静的スコープがあるとどうなりますか? 1はなぜ印刷されないのですか?

この場合の2の印刷は動的スコープではありませんか?

静的スコープでは、最も近いxを関数定義に取るべきだと思いました。

+3

ここでは、(グローバル変数として)ただ一つの 'x'を宣言します。したがって、コードのどこからでも行われた変更は、コードの他の場所からの後の使用に影響を与えます。 – NiBZ

+1

なぜでしょうか? xは定数ではなく、返される前に変更されます。 – George

+0

これは最も近いものを取っていますが(ただし、どちらか一方しか選択できません)、関数呼び出しの前に代入が行われます。したがって、2が印刷されます。意図したとおりに動作します。 – Borgleader

答えて

7

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を持っています。

+0

なぜ、私は理解できません。 –

+0

@SurajJainあなたはもっと具体的になりますか? – nwp

+0

私はその値を印刷できないのです。私はあなたの答えを理解していません。 –

2

あなたがないを持っているので、スコープがここに議論の余地あるがそうでないグローバルxを陰にしたであろうローカルxを宣言しました。

2が印刷されます。

xfがパラメータ0で呼び出される直前に2からmainに割り当てられています。

mainが入力される前に、概念的にint x = 1;が走っている。)

1

これは、コンパイラがアセンブリ/マシン・コードを生成する方法です。

  • 最初のグローバル変数Xは、メモリ位置 "ABC" に格納され
  • 次主に実行される: : "ABC" でグローバル変数Xが呼び出される)(ここで2
  • 関数fに変更されます
    • 関数fが "ABC" でグローバル変数Xの値を返す:2
  • Fの戻り値である()が印刷されています。

したがって、メイン関数のスコープに別のXが必要な場合は、nwpの回答のように新しいオブジェクトを作成しておく必要があります。

+1

"nwpの回答のように新しいオブジェクトを作ったはずです。"これは@nwpのコードで何が起こるかではなく、世界で最悪のコンパイラを使用していることが少なくなります。 – George

+0

@george:本当ですが、質問の単純さを見て、コンパイラの詳細を詳述したくありませんでした;) – JHBonarius

+0

最後の行から、printf( "%d"、f(x) )); 'は2を出力します< - 明らかに変数を2回初期化することはできませんので、ちょっとだけ明確にするとよいでしょうか?あなたまで、あなたはまだ私の投票をすることができます:) – George

1

これらは通常、動的でという語彙スコープと呼ばれます。

レキシカルスコープは、コンパイル時に、実行時に動的スコープで完全に決定されます。

"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が印刷されます。

関連する問題