为什么我们可以在C++中使用未初始化的变量?

uno*_*yar 4 c++ variables

在 Java、C# 或 PHP 等编程语言中,我们不能使用未初始化的变量。这对我来说很有意义。

C++ dot com规定未初始化的变量在第一次被赋值之前具有不确定的值。但对于整数情况它是 0?

我注意到我们可以在不初始化的情况下使用它,并且编译器不会显示错误并且代码会被执行。

例子:

#include <iostream>
using namespace std;

int main()
{
    int a;
    char b;
   
    a++; // This works... No error
    cout<< a << endl; // Outputs 1
 
    // This is false but also no error...
    if(b == '0'){
      cout << "equals" << endl;
    }
 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试用其他语言(例如 C#)复制上述代码,则会出现编译错误。我在官方文档中找不到任何内容。

我非常重视你的帮助。

Bat*_*eba 11

C++ 给了你搬起石头砸自己脚的能力。

将整型变量初始化为 0 的机器指令通常采用以下形式

REG XOR REG
Run Code Online (Sandbox Code Playgroud)

如果您想将其初始化为其他内容,那么它的存在就不太令人满意。这对于一种自诩最快的语言来说是令人厌恶的。您关于整数初始化为零的断言是不正确的。

在 C++ 中使用未初始化变量的行为是未定义的。


Rev*_*lot 5

检测或证明在所有情况下都使用未初始化的变量是不可行的,甚至是不可能的。例如:

int a;
if (<complex condition>)
    a = 0;
if (<another complex condition>)
    a = 1;
++a;
Run Code Online (Sandbox Code Playgroud)

是否存在两个条件都为假的情况?除非您对程序进行广泛的分析,否则您不会知道。可以传递变量指针,可能涉及多线程,这使得分析变得更加困难。因此,决定信任程序员并仅声明这些 UB。
现代编译器可以在许多未初始化变量使用的情况下发出警告,并且您应该始终使用最大警告级别。