繁体   English   中英

为什么静态修饰符阻止其变量重新分配新值?

[英]Why does the static modifier prevent its variable to be reassigned with a new value?

一个最小的工作示例如下:

#include <iostream>

void func()
{
    static int i = 5;
    std::cout << i << std::endl;
    i = 42;
    std::cout << i << std::endl;
}

int main( int argc, char ** argv )
{
    std::cout << "this is main()" << std::endl;
    func();
    func();
    return 0;
}

其输出如下:

this is main()
i is 5
i is 42
i is 42
i is 42

变量int的 静态修饰符使int的值在整个过程的生命周期中保持不变,而静态存储未存储在堆栈中; 因此,该值是从函数的一次调用传递到另一次的。

然而,INT被重新指派到5的值在FUNC()的开始时FUNC()被调用两次。

那么,为什么此示例输出i = 42而不是i = 5

但是,当第二次调用func()时,int在func()的开头重新分配为5的值。

不,这不是赋值 ,而是初始化 静态局部变量仅初始化一次,即,首次调用func()时。

在块范围内使用说明符static声明的变量具有静态存储持续时间,但在控件第一次通过它们的声明时进行初始化(除非其初始化为零或常量初始化,可以在首次进入该块之前执行该初始化)。 在所有其他调用上,将跳过声明。

等号=可能使您感到困惑。

static int i = 5;的等号static int i = 5; 表示复制初始化 ,而不是赋值:

命名变量的复制初始化中的等号=与分配操作符无关。

从而,

但是,在func()的开头将int重新分配为5的值。

错了 永远不会func的开始分配它,无论是第一次还是以后的调用。 i = 42;分配i = 42;

您也可以这样编写:

static int i(5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM