根据我的推理,输出应该是 0456,但编译器显示 0415,我对其进行了一些调试,并意识到它的目标是不同的“i”。
如果有人能解释其背后的原因,我将不胜感激。谢谢 :)
#include <iostream>
using namespace std;
int main()
{
static int i;
for(int j = 0; j<2; j++)
{
cout << i++;
static int i = 4;
cout << i++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您应该期望输出如下:
0(顶级块作用域i),然后是4(for循环块作用域i)。1(顶级块作用域i),然后是5(for循环块作用域i)。因此0415。
static int i; // declares i at block-scope; denote as (i1)
for(int j = 0; j<2; j++)
{ // enter nested block scope
cout << i++; // at this point, `i` local to current
// block scope is yet to be declared.
// thus, this refers to (i1)
static int i = 4; // this declares a local `i` (denote as (i2))
// which shadows (i1) henceforth
cout << i++; // this refers to (i2)
}
Run Code Online (Sandbox Code Playgroud)
即使局部静态变量的生命周期i从第一次循环传递(第一次控制传递其声明)开始,从而在第二次传递时跳过其声明,这也不会影响其范围。
块作用域
在块(复合语句)中声明的名称的潜在范围从声明点开始,到块末尾结束[...]
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |