-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;

我的第二个问题是这个

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 

我的意思是在内部块中,一旦将静态 int a 重新初始化为 20,即使它退出块后它也不应该是相同的值吗?因为静态变量的作用域是整个程序。

4

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;
}

a正如您似乎已经理解的那样,第二个范围不同。“重新定义 a”错误仅适用于在同一范围内定义两个具有相同名称的变量时。

void main() {
    static int a=10;

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

}

同样,a内部块的内部仅在该块内具有范围。如果您重新输入相同的块,a将继续具有相同的值,因为您将其声明为static. 但是,在块之外,您将使用第一个变量的值a这说明了变量的作用域和它的生命周期之间的区别。

于 2014-10-03T20:00:04.297 回答