为什么默认情况下会初始化局部变量?

Las*_*ain 1 c++ gcc g++

"C++编程语言 "一书 9.2节中,Bjarne Stroustrup写道:

请注意,默认情况下会初始化在全局或命名空间范围内未定义初始值设定项的变量.对于在免费商店中创建的局部变量或对象,情况并非如此.

但是以下程序打印的值为0:

#include <iostream>
using namespace std;

int main() {
    int x;
    cout << x << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它不应该返回某种错误吗?

g++用来编译.

Chr*_*ckl 6

但是以下程序在我的终端上打印了一个值0.

它有未定义的行为,因为该cout行试图从未初始化的读取int.您看到的任何输出,实际上任何行为都不能得到保证.

它不应该返回某种错误吗?

不,这不是未定义行为的工作原理.您可能会或可能不会看到错误.


Ron*_*eau 5

x是未初始化的,因此您的代码段实际上具有未定义的行为.


它不应该返回某种错误吗?

g++ 默认情况下不会警告未初始化的值.

-Wuninitialized如果希望编译器显示警告,则需要该选项:

g++ -Wuninitialized your_file.c
Run Code Online (Sandbox Code Playgroud)

您应该使用该-Wall选项来启用此警告以及许多其他有用的警告.

在警告选项的详细信息在这里