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