C++ 这是一种未定义的行为,你会怎么说?

C++ 这是一种未定义的行为,你会怎么说?,c++,C++,被这篇文章的答案所激励 我有以下代码: int main() { const int weeks = 10; const int salespersons = 9; const int days = 30; double weekly_sales[weeks][salespersons][days]; double total_weekly_sales[weeks]; double total_overall_weekly_sales[salesperson

被这篇文章的答案所激励

我有以下代码:

int main()
{
   const int weeks = 10;
   const int salespersons = 9;
   const int days = 30;

   double weekly_sales[weeks][salespersons][days];
   double total_weekly_sales[weeks];
   double total_overall_weekly_sales[salespersons];
   int a;
   cout << "a = " << a <<endl;
   cout << total_weekly_sales[0] <<endl; 
   for(int w=0; w < weeks;w++)
   {
      for(int d =0; d < days; d++)
      {  
          for(int s=0; s < salespersons; s++)
          {
              total_weekly_sales[w]+=weekly_sales[w][s][d];
              total_overall_weekly_sales[s]+= weekly_sales[w][s][d];
          }
       }  
    }
 cout << total_weekly_sales[0] <<endl;
}
根据gcc 4.5.3,带有编译选项-墙

我还在这里编译了代码:$2。输出与上面相同

我还在VS2010下编译了代码。 VS2010发出如下警告:

warning C4700: uninitialized local variable 'a' used
warning C4700: uninitialized local variable 'total_weekly_sales' used
当我跑步时:

Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.
我知道不初始化局部变量并使用它们是不好的做法。我也明白这会有问题

我的问题是:

在C++标准中,有没有使用未初始化的局部变量会导致未定义行为的地方?为什么它在不同的编译器下表现不同?这是否意味着该标准实际上没有强制所有编译器都应该实现有关使用未初始化局部变量的正确操作?那么,从编译器输出中,您如何判断它是未定义的行为呢


谢谢。

是的,标准明确规定,未初始化对象上的左值到右值转换将导致未定义的行为:

非函数、非数组类型T的glvalue 3.10可以转换为prvalue。如果T是不完整的类型,则需要进行此转换的程序格式不正确。如果glvalue引用的对象不是T类型的对象,也不是从T派生的类型的对象,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为

任何需要使用object的值的操作都将调用从左值到右值的转换

未定义的行为定义为:

本国际标准不要求的行为

因此,是的,一个行为未定义的程序可以做任何事情,即使它看起来工作正常。因此,您不能总是从程序的输出中识别未定义的行为。真正的解决方案是编写正确的、定义良好的代码。要做到这一点,我强烈推荐在你的身边有一个C++标准的拷贝。编写代码并对它做的假设是非常糟糕的,所以如果你写了任何你不确定的C++,一定要检查它。 为什么标准中存在未定义的行为?首先,这意味着你只会得到你想要的。例如,如果定义了一个未初始化的变量来自动获取值0,那么您声明的每个未初始化的变量都将有一些额外的操作来将值设置为0,而这可能是不需要的。标准只是说,使用未初始化变量的值是未定义的,允许它保留该内存位置中已经存在的垃圾值。没有额外费用


第二,它允许编译器基于任何C++程序员编写健全、明确的代码的假设进行优化。

< P>未定义的行为正好意味着。这种行为没有定义。有些编译器会很好地警告你,而另一些会做一些疯狂的事情。理论上,在这种情况下,他们可以擦除你的硬盘,但那将是一个相当糟糕的编译器


要获得特定值,未初始化的变量可以有任何值。在实践中,如果您的程序刚刚启动操作系统提供的安全功能以停止您的程序从旧程序读取内存,则它通常为0,但一旦它运行了一段时间,它很可能是一个完全随机的值,因为该内存以前被另一个函数使用过。因此发出警告。如果忽略它,程序将在没有明显原因的情况下随机失败。C++中的

:有没有地方说使用未初始化的局部变量会导致未定义的行为?是的,有。一个好的起点是理解未定义的行为实际上意味着什么@chris所以,如果一个编译器不执行这个标准,那么有时仅仅通过查看编译器输出来判断它是否是未定义的行为是不可能的?@NPE谢谢。你说得很好。这里还有一个:它没有被定义为编译器的优化机会;如果编译器需要为每个声明添加归零代码,事情会变慢。为方便起见,C++11草稿链接:
Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.