#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,即使它退出块之后也不应该是相同的值吗?因为静态变量的范围贯穿整个程序。
答案 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
的值。这说明了变量范围与生命周期之间的差异。