【问题标题】:Strange C++ matrix multiplication/initialization奇怪的 C++ 矩阵乘法/初始化
【发布时间】:2016-02-03 03:32:49
【问题描述】:

我正在使用 Cygwin、Windows Vista、Norton 防病毒软件(以前有人问过我这个问题)。我之前问过一个关于奇怪的 C++ 行为的问题,没有人能回答。这是另一个。简单的矩阵乘法练习。下面这个表格给出了奇怪(和错误)的结果:

#include <iostream>
#include <string>
#include<cmath>

using namespace std;

int main(int argc, char* argv[])
{
   int A[3][3]={{1,5,0},{7,1,2},{0,0,1}};
   int B[3][3]={{-2,0,1},{1,0,0},{4,1,0}};
   int D[3][3];
   for (int i=0;i<3;i++)
   {
      for(int j=0;j<3;j++)
      {
         for (int k=0;k<3;k++)
         {
            D[i][j]+=A[i][k]*B[k][j];

         }
      }
   }

   for (int i=0;i<3;i++)
   {
      for(int j=0;j<3;j++)
      {
         cout<<D[i][j]<<"\n";
      }}
   return 0;
}

但是一个非常小的变化给出了正确的结果:(我所做的只是将初始化的矩阵移到 main() 之外)。

#include <iostream>
#include <string>
#include<cmath>

using namespace std;

int A[3][3]={{1,5,0},{7,1,2},{0,0,1}};
int B[3][3]={{-2,0,1},{1,0,0},{4,1,0}};
int D[3][3];

int main(int argc, char* argv[])
{
   for (int i=0;i<3;i++)
   {
      for(int j=0;j<3;j++)
      {
         for (int k=0;k<3;k++)
         {
            D[i][j]+=A[i][k]*B[k][j];

         }
      }
   }

   for (int i=0;i<3;i++)
   {
      for(int j=0;j<3;j++)
      {
         cout<<D[i][j]<<"\n";
      }}
   return 0;
}

【问题讨论】:

  • 什么是“奇怪(和错误)的结果”?什么是“正确结果”?
  • 我同意。错误的结果是非常大的数字,正确的结果是更“合理”的数字,我并不希望如此。不管问题在下面得到解答。

标签: c++ matrix


【解决方案1】:

在第一种情况下,您忘记将数组 D 初始化为 0。当数组是全局数组时,这会自动完成,但在本地数组时不会(简化,但解释了行为)。

【讨论】:

  • 谢谢你。 C++ 如何选择荒谬的数字,例如:-2144138944 1 -13216 0 -2144138944 1 -12816 等在后一种情况下将 D 初始化为?
  • 如果未初始化,则该值将是最后发生在该内存点中的任何值。
  • @Nights C++ 根本没有选择这些值。从技术上讲,读取一个未初始化的变量是Undefined Behavior,任何事情都可能发生。实际上,您将看到 atm 中发生的任何内容或编译器设置的某些调试值(例如,MSVC 在调试版本中将未初始化的字节设置为 0xCC)被解释为您的数据类型。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2023-03-22
  • 2017-05-18
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多