dex*_*ter 1 c c++ initialization
摘自李普曼的《C++ Primer》,
当我们定义一个变量时,我们应该给它一个初始值,除非我们确定在该变量用于任何其他目的之前该初始值将被覆盖。如果我们不能保证变量在被读取之前会被重置,我们应该初始化它。
如果在操作中使用未初始化的变量会发生什么?它会崩溃/代码会无法编译吗?
我在互联网上搜索了相同的答案,但有不同的“说法”。因此出现以下问题,
C 和 C++ 标准在处理未初始化变量的方式上是否有所不同?
对于类似的疑问,如何以及在哪里可以找到“官方”答案?对于业余爱好者来说查找 C 和 C++ 标准实用吗?
Q.1) 如果在操作中使用未初始化的变量会发生什么?它会崩溃/代码会无法编译吗?
许多编译器会尝试警告您有关不正确使用未初始化变量值的代码。许多编译器都有一个选项,表示“将警告视为错误”。因此,根据您使用的编译器和调用它的选项标志以及变量未初始化的明显程度,代码可能无法编译,尽管我们不能说它将无法编译。
如果代码确实编译了,并且您尝试运行它,那么显然无法预测会发生什么。在大多数情况下,变量一开始将包含“不确定”值。任何人都可以猜测这个不确定的值是否会导致您的程序正常工作、不正确工作或崩溃。如果变量是一个整数,并且您尝试对其进行一些数学运算,您可能会得到一个奇怪的答案。但如果该变量是一个指针并且您尝试间接访问它,则很可能会发生崩溃。
人们常说,未初始化的局部变量一开始就包含“随机垃圾”,但这可能会产生误导,正如在这里发布问题的人数指出的那样,在他们尝试过的程序中,该值不是随机的,但始终为 0 或始终相同。所以我想说,未初始化的局部变量永远不会一开始就保存您所期望的内容。 如果您期望它们是随机的,您会发现(至少在任何一天)它们是可重复和可预测的。但是,如果您期望它们是可预测的(并且,上帝会帮助您,如果您编写依赖于它的代码),那么通过 jingo,您会发现它们非常随机。
使用未初始化的变量是否会导致程序形式上未定义是一个复杂的问题。但你也可以假设确实如此,因为你想避免这种情况,就像你避免任何其他危险的、不完美定义的行为一样。
有关这种情况下未定义和不确定行为之间的细微区别的更多(更多!)信息,请参阅这个老问题和另一个老问题。
Q.2) C 和 C++ 标准在处理未初始化变量的方式上是否有所不同?
他们可能有所不同。正如我上面提到的,至少在 C 中,事实证明并非所有未初始化局部变量的使用都是形式上未定义的。(有些仅仅是“不确定的”。)但是这里其他答案引用的 C++ 标准的段落听起来好像它一直是未定义的。同样,出于实际目的,这个问题可能并不重要,因为正如我所说,无论如何你都会想避免它。
Q.3) 对于类似的疑问,如何以及在哪里可以找到“官方”答案?对于业余爱好者来说查找 C 和 C++ 标准实用吗?
获得标准的副本并不总是那么容易(更不用说官方的了,这通常要花钱),而且这些标准可能很难阅读和正确解释,但是,是的,只要付出努力,任何人都可以获取、阅读和尝试使用标准回答问题。您可能并不总是在第一次就做出正确的解释(因此您可能需要寻求帮助),但我不会说这是不尝试的理由。(一方面,任何人都可以阅读任何文档,但最终无法在第一时间做出正确的解释;这种现象不仅限于业余程序员阅读复杂的语言标准文档!)
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |