-1
#include<stdio.h>
int main(){
    int a=10;
    {    printf("%d",a);
         int a=20;
         printf("%d",a);
    }
    printf(" %d",a);
    return 0;
}

Output:10 20 10

上記のコードでは、変数 a (内側のブロック内) の可視性がそのブロック内でのみスコープを持つことを理解しているため、その特定の出力が得られます。しかし、そのブロックの外側で宣言されている変数 a は、内側のブロック内でもスコープを持つ必要があります...したがって、どうすれば再度入力できるのでしょうか。int a=20; 「a の再定義」や「前の宣言のがここにあった」。私が使用する場合のように

int b=10;
int b=15;

私の2番目の問題はこれです

void main() {
 static int a=10;

    {
         printf("%d ",a);
         static int a=20;
         printf("%d",a);
    }
    printf(" %d",a);

}

「a の再定義」のようなエラーが発生しない理由についての前のコードと同じ疑問は別として、これはこのコードに関連する私の疑問です。

上記のコードについては同じ結果Output: 10 20 10が得られますが、私が期待していたのは

10 20 20 

static int a が 20 に再初期化されると、内側のブロックで、ブロックを終了した後でも同じ値になるべきではないということですか? 静的変数のスコープはプログラム全体に及ぶためです。

4

2 に答える 2

2

最初の問題の答え: これは可変シャドウイングと呼ばれます。ウィキペディアから:

変数のシャドウイングは、特定のスコープ (決定ブロック、メソッド、または内部クラス) 内で宣言された変数が、外部スコープで宣言された変数と同じ名前を持つ場合に発生します。

簡単に言えば、同じ名前の変数を別のスコープで作成すると、前の変数がシャドウされます。

2番目の問題について-これは良い例です:

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}

出力:

nStatic は 0

nStatic は 1 です

nStatic は 3

nStatic は 6

nStatic は 10

于 2014-10-03T20:01:12.153 に答える
1
#include<stdio.h>
int main(){
    int a=10;
    {    printf("%d",a);
         int a=20;
         printf("%d",a);
    }
    printf(" %d",a);
    return 0;
}

2 番目aは、既に理解しているように、別のスコープにあります。「a の再定義」エラーは、同じスコープで同じ名前の 2 つの変数を定義した場合にのみ適用されます。

void main() {
    static int a=10;

    {
         printf("%d ",a);
         static int a=20;
         printf("%d",a);
    }
    printf(" %d",a);

}

繰り返しaますが、内側のブロックの内側には、そのブロック内のみのスコープがあります。同じブロックを再入力すると、aは として宣言したため、同じ値を持ち続けますstatic。ただし、ブロックの外では、最初の variable の値を使用しますaこれは、変数のスコープとその有効期間の違いを示しています。

于 2014-10-03T20:00:04.297 に答える