C/C++ 中使用 Static 关键字输出的问题

AxR*_*xRy 2 c++ static

根据我的推理,输出应该是 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)

dfr*_*fri 6

您应该期望输出如下:

  • 循环传递#1:打印0(顶级块作用域i),然后是4(for循环块作用域i)。
  • 循环传递#2:打印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从第一次循环传递(第一次控制传递其声明)开始,从而在第二次传递时跳过其声明,这也不会影响其范围

块作用域

在块(复合语句)中声明的名称的潜在范围从声明点开始,到块末尾结束[...]