问题描述
我正在启动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/