2012-03-01 13 views
3

私が書く場合:C複数の変数宣言

int a = 1; 
int a = 2; 

私は私が書くがあれば、コンパイル時エラーを取得していない:

while(1) { 
    int a = 1; 
} 

何コンパイル時のエラー - いただきました!違いは? whileループには独自のスコープがありますか?

+1

@Benoit:ローカル変数は、C89のブロックの先頭とC99のどこかで宣言できます。上記の2番目のコードは有効なC89とC99です。 – interjay

+0

私はこれが気づいたことをうれしく思っています - 私が最初に思ったような振る舞いは、確かにバグの原因になっていました。迅速かつ簡潔な説明のおかげで – bph

答えて

4

2番目のケースでは、同じスコープに同じ名前のの複数の変数を定義しません。何が起こるかはしかし、我々は

int a = 1; //define variable a; 

int a = 1; //variable a has been defined in this scope already, so error! 
4

はい、ループの各反復は独自のスコープを持っているを持って、最初のケースで、この

while(1) { //there is no variable a in this scope 
    int a = 1; //define a variable a at this point. 
} //variable a is no more 

です。反復がループ終了に達すると、内部で定義された変数はなくなります。

3

はい、ループのカッコが新しいスコープを開きます。内のすべての変数が、外側スコープと同じ名前の変数を非表示にします。

2

あなたはそれを推測しました!

Cでは、サブスコープ内で識別子を再定義することができます。したがって、whileスコープは異なるスコープで、変数aをシャドーすることができます。もちろん、そのサブブロック内でのみ有効です。これは、この動作を認識していない場合は、多くの問題を引き起こす可能性があります。

1

はい{}は新しいスコープを定義します。

1

はい、ループブロックは単独のスコープです。ループの終わりに達すると、aが範囲外になり、次の反復のために新しいaを宣言することができます。

1

この違いは範囲内です。スコープは中括弧 - {}で決定されます。最初のケースでは、両方の変数が同じスコープを共有するため、エラーが発生しました。後者の場合は、ローカル変数(whileスコープの変数)を定義します。ループの各反復で新しい変数が作成されます。これは完全に有効なので、エラーが発生しない理由です。あなたがint a = 1;を実行した後、あなたはそのブロック内で宣言されているすべての変数を削除し、{ }ブロックを残すhttp://crasseux.com/books/ctutorial/Scope.html

1

- これは私がより多くのそれを研究勧めしたいあなたに不明である場合 は、ここでは良いスタートです。 while(true)ループを実行しているときに別の{ }ブロックを入力しますが、その新しいブロックは以前に 'a'変数を作成したことを「認識」しません。例えば

{ 
    int a = 1; 
} 
a = 2; 

同じ理由

編集用にコンパイルされません:それは分以内すでに5件の回答があった、クレイジーです!

+0

それは完全にクレイジーです! – bph