奇怪的C++矩阵乘法/初始化

Strange C++ matrix multiplication/initialization

本文关键字:初始化 C++      更新时间:2023-10-16

我正在使用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;
}

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