混淆与自动和静态变量有关

时间:2014-10-03 19:53:52

标签: c++ c static auto storage-class-specifier

#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; 它不应该给我一个错误,如“重新定义一个”和“先前的声明在这里”。就像我使用

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

}

除了与之前的代码相同的疑问,为什么我没有得到像“重新定义”这样的错误,这是我对此代码的疑问。

对于上面的代码我得到相同的Output: 10 20 10,但我期待的是

10 20 20 

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

2 个答案:

答案 0 :(得分:2)

回答第一个问题:它被称为变量阴影。来自维基百科:

  

变量阴影发生在某个变量内声明的变量   范围(决策块,方法或内部类)与a具有相同的名称   在外部范围内声明的变量。

简单地说,当你创建一个具有相同名称但在其他范围内的变量时,它会隐藏上一个变量。

关于第二个问题 - 这是一个很好的例子:

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

答案 1 :(得分:1)

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

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

void main() {
    static int a=10;

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

}

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