与自动变量和静态变量相关的混淆


#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,在内部块中,即使它退出块,它不应该是相同的值吗? 因为静态变量的范围贯穿整个程序。

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

当在某个变量中声明的变量时,会发生变量阴影 作用域(决策块、方法或内部类(与 变量在外部作用域中声明。

简而言之,当您创建一个具有相同名称但在其他作用域中的变量时,它会隐藏前一个变量。

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

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

输出:

n静态为 0

n静态为 1

nStatic 是 3

n静态为 6

n静态为 10

#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 。这说明了变量的作用域与其生存期之间的差异。

相关内容

  • 没有找到相关文章

最新更新