gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:40:26 25 4
gpt4 key购买 nike

#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(内部 block 内)的可见性仅在该 block 内具有范围,因此我得到了特定的输出。但是在该 block 之外声明的变量 a 即使在内部 block 内也应该有其作用域...因此我怎么可能再次输入 int a=20;难道它不应该给我一个像“重新定义a”和“先前声明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);

}

除了与之前的代码相同的疑问,即为什么我没有收到“redefinition of a”之类的错误之外,这是我与此代码相关的疑问。

对于上面的代码,我得到相同的输出:10 20 10,但我期望的是

10 20 20 

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

最佳答案

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

variable shadowing occurs when a variable declared within a certain scope (decision block, method, or inner class) has the same name as a variable declared in an outer scope.

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

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

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

n静态为 1

nStatic 为 3

nStatic 为 6

nStatic 为 10

关于c++ - 与自动变量和静态变量相关的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com