为什么静态修饰符会阻止其变量重新赋值
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 的值在整个进程的生命周期内持久存在,而静态存储不存储在堆栈上;因此,该值从函数的一个调用传递到另一个调用。
但是,当第二次调用 func(( 时,int 在 func(( 的开头被重新赋值 5。
那么,为什么此示例输出i = 42
而不是i = 5
?
但是,当第二次调用 func(( 时,int 在 func(( 的开头被重新赋值 5。
不,这不是赋值,而是初始化。静态局部变量只初始化一次,即第一次调用func()
时。
在块范围内声明的变量与说明符 static 有 静态存储持续时间,但首次初始化控制 通过它们的声明(除非它们的初始化为零 或常量初始化,可以在块之前执行 首次输入(。在所有进一步的调用中,将跳过声明。
您很可能对等号感到困惑,=
.
等号static int i = 5;
表示复制初始化,而不是赋值:
命名变量的复制初始化中的等号 = 不是 与赋值运算符相关。
因此
但是,int 在 func(( 的开头被重新赋值 5
这是错误的。它永远不会在func
开始时分配,无论是第一次还是以后的调用。它仅由i = 42;
分配。
你也可以这样写这行:
static int i(5);
相关文章:
- 为"adjacent"变量赋值时出现问题
- 非常量变量只读位置的赋值
- 变量在使用赋值语句赋值后恢复为以前的值
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 如何在 c++ 中正确声明/赋值变量的值
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何在不使用赋值运算符的情况下为动态变量赋值?
- 为什么我不能为变量赋值函数?
- 可视化的c++变量赋值使代码正常工作
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 如何为结构类型变量赋值
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- C++中重载复合赋值运算符不会更改变量
- 在结构的构造函数中使用类方法赋值变量
- 在 If 语句 [C++] 中赋值变量
- 我是给同一个变量赋值还是重新定义一个新变量
- 赋值变量时c++未处理异常访问冲突
- 增强标记器重新赋值
- 使用reinterpret_cast赋值变量后可能的析构函数