c++ - C++ 中的隐式变量初始化
问题描述
#include <iostream>
int a;
void foo();
int main()
{
std::cout << "a = " << a << std::endl;
foo();
return 0;
}
void foo(){
int b;
std::cout << "b = " << b << std::endl;
}
输出:
a = 0
b = 32650
我创建了一个名为的函数foo
,它声明一个int
变量并打印它。它打印一些垃圾值,因为b
在声明时未初始化,那么如何a
初始化为0
每次
为什么在被a
初始化为一些垃圾值的0
同时被初始化为?b
解决方案
来自 c++17 标准草案(其他标准几乎相同):
3.6.2 非局部变量的初始化【basic.start.init】
...
具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他初始化发生之前进行零初始化(8.5)。
...
3.7.1 静态存储时长[basic.stc.static]
...
所有没有动态存储持续时间、没有线程存储持续时间和非本地变量的变量都有静态存储持续时间。这些实体的存储应持续到程序的持续时间(3.6.2、3.6.3)。
如果您深入定义,您会发现它a
实际上具有静态存储持续时间(它是全局变量),因此它是零初始化的。
推荐阅读
- html - 如何使用 Thymeleaf 将 href 添加到绑定列表
- javascript - jQuery resize 停止运行,抛出错误 - TypeError: this.listeners is undefined
- javascript - 将 Whatsapp 降价转换为 HTML 标签
- prestashop-1.7 - 我想找到并访问我的页面 http://myprestashopurl.com/en/login
- javascript - 警报框 - 仅在单击 (x) 时应隐藏
- javascript - 将具有子类名称的所有元素添加到一个数组
- javascript - 在 svelte 中导入 javascript 文件
- mysql - 如何在 MySQL 中的“FROM”子句上使用“LIKE”函数
- android-studio - Android Studio 调色板属性问题
- azure-analysis-services - JSON DDL 请求失败 - 管道行集丢失