【问题标题】:Variable initialisation in C++ using clang++ and g++ [duplicate]使用clang ++和g ++在C ++中进行变量初始化[重复]
【发布时间】:2020-01-20 16:39:03
【问题描述】:

我很难理解这个由两个不同编译器编译的简单示例发生了什么:

#include <iostream>
using namespace std;

int main()
{
    double x;
    cout << x << endl;
    x += 1.0;
    cout << x << endl;
    return 0;
}

用 g++ 编译会得到

0
1

当用 clang++ 编译时,它给出了

6.95279e-310
1

我确信这是我缺乏理解,但任何理解这种行为的提示将不胜感激。重新分配时是否从 clang++ 设置 x = 0 生成编译代码,但在使用 cout 显示时不是?这是预期的行为吗?

问题:是否应该总是因为这些差异而初始化变量? C++ 中的常见做法是什么?

【问题讨论】:

  • 这是未定义的行为
  • “是否应该始终初始化变量” 是的。
  • 另外,在开始处理浮点数之前,您应该阅读this
  • 这是 AAA(几乎总是自动)帮助完全避免的错误之一,因为如果你写 auto x = 0;,你就不能忘记初始化 x
  • 第二种情况下你期望什么输出? 1.00000....(300 zeros)...00000695279?

标签: c++


【解决方案1】:

您遇到的是未定义的行为。在 C++ 中,变量不会为您初始化。

您的程序的输出可能因编译器而异,如果您多次运行它或在不同的机器上运行,它甚至可能会改变它的结果。

启用了 SDL 检查的 Visual Studio 2019 甚至无法编译它。

所以是的,您应该始终在使用变量之前对其进行初始化。

【讨论】:

  • 我不会一直这么说。 int size; cout &lt;&lt; "Enter size: "; cin &gt;&gt; size; 成语很好。这里没有理由给size 一个初始值,这会浪费CPU 周期。
  • Visual Studio 编译得很好……它只产生警告……See here
  • @ChrisMM 这取决于您的设置。我将操作的代码复制并粘贴到了几乎全新安装的 Visual Studio 2019 中,但出现编译时错误。所以我认为默认情况下这是一个编译时错误。它可以在您的 C++ / 常规设置中的“SDL 检查”下打开和关闭。
  • 默认是警告。 SDL 检查默认关闭。应该如此,因为它引入了运行时检查会影响性能。除非您处于调试模式?我从不使用调试。
猜你喜欢
  • 2013-12-21
  • 2023-04-03
  • 1970-01-01
  • 2015-01-28
  • 2018-03-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多