2017-01-09 2 views
0

私は(非常に簡単な例)この次のコードをお持ちの場合:変数の再宣言:なぜbody内の変数を再宣言するのが禁止されていますが、forループの内部はC++ではありませんか?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 20; 
    cout << a << endl; 
    int a = 15; 
    cout << a << endl; 
    return 0; 
} 

それを実行した後、それは次のようなエラーを与えます。私はそれの背後にある理由を完全に理解しています。

が、次のコード(上記と同じ副作用が、異なるが):

int main() 
{ 
    int T[2]; 
    T[0] = 20; 
    T[1] = 15; 
    for(int g=0; g<2; g++) 
    { 
     int a = T[g]; 
     cout << a << endl; 
    } 
} 

変数aは、任意の綿毛なしで再宣言され、それが動作します。私は混乱しています、なぜこれが起こりますか?または、これの背後にある理由は、forループのために変数が別のスコープで再宣言されているか、またはその背後に別の正しい理由があるかです。

+2

2番目のバージョンで再宣言される変数はありません。 1つの宣言だけがあります。制御フローが出現するソース行を何度も通過するかどうかは関係ありません。 – Jon

+1

スコープブロック! {}の間にローカルとして宣言されたものはすべて外部からは見えません。ループで...ループの各反復には、そのスコープブロックの独自の "コピー"があります。つまり、あるループのローカルが次のループでは表示されないことを意味します。 – Jonathan

+0

すべての{}で宣言されているすべてのものは、変数が宣言されていれば独自のミニユニバースを持っていますが、宇宙全体(一種の〜ボディ)では何も知られていません。 – DomainFlag

答えて

2

1語:scope

{}ペアが新しいスコープを作成します。スコープはネストすることができます。

最初の例では、2つの別々の変数が同じスコープで宣言されていますが、これは許可されていません。

forループの本体のスコープ内で、2つの変数ではなく、a変数が宣言されています(先頭には競合しません)。ループが複数回実行されているからといって、複数の変数が宣言されているわけではありません。 aはループ本体に対してローカルなので、ループの繰り返しは毎回a変数を割り当て、使用、解放します(実際には、コンパイラは毎回同じメモリを再利用するよう最適化します)。

+0

今すべては非常にクリアです、ありがとう! – DomainFlag

1

C++変数にブロックスコープがあります。ブロックがネストされている場合、forループと同様に、最も内側のネストを持つ変数が参照されます。これにより、ローカル変数の名前を変更せずにブロックを貼り付けることができます。

-3

これは問題ではありません。コンパイラは最近、宣言を読むのに十分スマートです。重要なのは、上記の例で保存したスペースだけです。 2つの異なる値に対して同じ識別子を使用できるようにすることで、コンパイラを混乱させました。重要なことの1つは実行のスピードですが、これらのケースではほんのわずかです。あなたは3つの問題を検討する必要がある

+0

間違っています。繰り返し2が始まると、反復1の "a"は存在しません。また、適切な英語で書くようにしてください。スペルミスをした場合、確かに起こりますが、「あなた」の代わりに「u」を使用し、カンマやドットを使用しないでください。あなたの文章は読むのが面倒です。 – Aziuth

1

:C++の変数の最初の

  • があなたのケースをblock-scope.inている、それはあなたがすべての{}内の同じ変数を定義できることを意味。

  • forループの各ループがコンテキストであり、あなたの場合にだけあなたがあなたblock..inに(たとえ異なるタイプで)同じ変数を定義カント{}

  • のn個のブロックを有する想像case int a = 20とint a = 15は同じブロックにあり、これはexeptionをスローします。変数を一度定義するだけで、次のように値を変更する必要があります。int a = 20; a = 15;それはあなたの宣言エラーが発生しますので、あなたのmain最初の例では

    あなたが同じスコープでa牽引回を宣言:

1

理由は、ローカル変数の寿命と呼ばれるこの概念はあなたのケースでは簡単です。

をforループのスコープ内に宣言すると、ループスコープの外側で変数の有効期間が終了しても存在しないと考えることができるため、エラーは発生しません。この概念を理解する

は、この例を見て、それをしようとします:

int a = 4; 
for(int i=0; i<4; i++) 
    { 
     int a = 2; 
     cout << a << endl; 
    } 
     cout << a << endl; 

この例では、ループのための側の範囲で印刷されます:

2 
2 
2 
2 

をし、ループのスコープの外の印刷します:

4 

この概念は、ローカル変数スコープライフタイムと呼ばれます。

2

それの概念を取得するための優れた方法:次のコードを実行し :あなたが知っているように

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a = 20; 
    cout << &a << endl; 
    int a = 15; 
    cout << a << endl; 
    return 0; 
} 

int main() 
{ 
    int T[2]; 
    T[0] = 20; 
    T[1] = 15; 
    for(int g=0; g<2; g++) 
    { 
     int a = T[g]; 
     cout << &a << endl; 
    } 
} 

、参照演算子(&)は、メモリ内の変数のアドレスを返します。 2つの変数のアドレスが異なる場合、それらが同じではないと結論づけることができます。おかげさまで

関連する問題