为什么在不需要时进行零初始化

问题描述

我正在启动C ++,看到课程/教程的作者对变量进行零初始化,并开始怀疑为什么零初始化甚至是一个选项?您可以只识别变量,然后再分配一个值。有性能上的好处吗?还是读者可以更好地理解代码

C ++示例:

opt1:

#include <iostream>

int main()
{
    int x{ }; //<-- difference here
    std::cout << "Enter a number: "; 
    std::cin >> x; 
    std::cout << "You entered: " << x << '\n';
    return 0;
}

opt2:

#include <iostream>

int main()
{
    int x; //<-- difference here
    std::cout << "Enter a number: ";
    std::cin >> x;
    std::cout << "You entered: " << x << '\n';
    return 0;
}

使用这两个选项,您将获得相同的输出

也许是我忘记了一些琐碎的事情(也没有在网上找到它)。

解决方法

您的代码没有明显的区别。

请考虑在进行用户输入之前,有人修改了代码以查看x的值。然后就可以了:

int x{ }; //<-- difference here
std::cout << "x before: " << x << '\n';
std::cin >> x; 
std::cout << "You entered: " << x << '\n';
return 0;

这段代码:

int x; //<-- difference here
std::cout << "x before : " << x << '\n';
std::cin >> x; 

具有undefined behavior。代码格式错误,不需要编译器发出错误或警告。大多数编译器都足以警告上面的代码,但这通常是您不能指望的。因此,不惜一切代价避免未定义的行为。

广泛接受的准则是始终初始化变量。换句话说,仅在可以初始化变量时声明它。例如,请参见C ++ CoreGuideline ES.20:Always initialize an object

并非总是可以在初始化时为变量赋予有意义的值。在您的示例中,x就是这种情况。由于std::cin将始终为x分配某些内容(在C ++ 11之前是不同的),因此我们实际上并不关心x之前的值是什么。不过,按照指南,我们应该写int x{};而不是int x;

请注意,在C ++ 11之前,从流中提取失败时,该值保持不变,请修改此类代码

 int x;
 std::cin >> x;
 std::cout << x;

是错误和危险的。如前所述,这在C ++ 11中已更改(现在,提取失败时会将零写入x中)。但是结论仍然是相同的:声明时最好已经初始化x

,

作者在下一章中解释了为什么不使用未初始化的变量会带来好处。

“请注意避免导致未定义行为的所有情况,例如使用未初始化的变量”。

不过,如果您知道所有内容都已定义,那应该没问题。

来源: https://www.learncpp.com/cpp-tutorial/uninitialized-variables-and-undefined-behavior/