【问题标题】:What happens to uninitialized variables? C++未初始化的变量会怎样? C++
【发布时间】:2016-12-06 04:34:29
【问题描述】:
int main()
{    
    int a;
    cout << a;
    return 0;
}

我想知道为什么输出值 0。我想如果一个变量未初始化,它会输出一个垃圾值。

不过,我还记得听说过整数的默认值是 0,所以我有点困惑。

谢谢

【问题讨论】:

  • 0 与任何其他值一样都是垃圾值。您有未定义的行为。这意味着无法保证您的程序会做什么。
  • @paddy 在无数可能的值中每次都得到 0 就像每次玩强力球一样,你不觉得有点可疑吗? :)
  • @zar:不是这样。在计算机内存中,有些数字比其他数字更常见,而 0 是最常见的。
  • 我认为这是一个调试负载,扮演愚蠢的虫子并以帮助的名义隐藏潜在的错误。
  • 不要假设未定义的行为意味着结果是随机的

标签: c++ variables initialization


【解决方案1】:

C++ 中未初始化函数作用域(即本地)整数的默认行为是indeterminate,这很好; 但是如果在定义之前使用该值,则会引入未定义的行为,并且任何事情都可能发生 - demons could fly out of your nose

cppreference 上的此页面提供了默认整数行为的示例。

另一方面,所有非局部、线程局部变量,而不仅仅是整数,都是 zero initialized。但这个案例并未包含在您的原始示例中。

(旁注:无论如何简单地初始化变量并完全避免潜在的危险通常被认为是一种好习惯......尤其是global variables的形式。)

在极少数特殊情况下使用全局变量的最佳实践存在例外情况,例如某些嵌入式系统;它根据启动时或初始循环迭代期间的传感器读数初始化值......并且需要在循环范围结束后保留​​一个值。

【讨论】:

  • 这是否意味着当输出 0 时,这仍然是未定义的行为。还有什么是默认值,你什么时候看到它们在起作用?
  • 是的,0 作为输出仍然是未定义的行为,即使它是所需的行为。并且没有默认值之类的东西。
  • 在您的帮助下 (ty) 并在阅读了更多内容后,我得出结论,只有全局变量在未初始化时设置为默认值,而局部变量在未初始化时将包含任意值。这听起来对吗?
  • @ec043 这不是相当正确,但在所有非本地(即“全局”)线程局部变量上确实发生了zero initialization
  • @ec043 感谢您接受我的回答,希望对您有所帮助!
【解决方案2】:

我认为你不相信给出的答案/cmets,也许你可以试试下面的代码:

#include <iostream>
using namespace std;

int main(){

 int a,b,c,d,e,f,g,h,i,j;

 cout<<a<<endl;
 cout<<b<<endl;
 cout<<c<<endl;
 cout<<d<<endl;
 cout<<e<<endl;
 cout<<f<<endl;
 cout<<g<<endl;
 cout<<h<<endl;
 cout<<i<<endl;
 cout<<j<<endl;

 return 0;
}

【讨论】:

  • 这很有帮助
  • 有趣的是,我尝试了所有 bool 值,但它们都是 0。这是否意味着某些数据类型有默认值?我意识到 0 是假的,整数有更多可能的值
  • 不要假设未定义的行为意味着结果是随机的。依赖于未定义行为的程序可以产生一致的结果。事实上,这个答案具有误导性,因为它暗示运行程序将为未初始化的变量输出不同的值。它可能。可能不会。
  • 具体来说,未初始化的 bool、char、int 和 double 会发生什么?
  • 对于布尔问题,您可能需要尝试比我们尝试的整数更多。一般1个整数是4个字节,1个布尔值是1个字节,如果涉及到同一个内存位置,那么1个0整数值对应4个0布尔值。
【解决方案3】:

原因是,变量获取垃圾值(一个未知/对程序毫无意义的值)是当有人运行程序时,它被加载到 RAM 的某些部分。现在这一切都取决于以前为某个位置设置的值,可能是以前有其他程序。 它只是碰巧您的程序已加载到RAM中恰好为0值的位置,这就是您得到的回报。

很有可能如果重新启动系统并尝试运行相同的程序,那么您可能会得到垃圾值。

以上语句对于没有被编译器初始化的变量有效。

【讨论】:

  • 变量的不确定值不保证等于内存之前的值。事实上,在大多数情况下,使用不确定的值会导致未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
相关资源
最近更新 更多