我试过这个代码,但有些不对劲
for (i = 0; i < row1; i++) {
for (j = 0; j < col2; j++)
suma = 0;
for (l = 0; l < row2; l++)
suma += a[i][l] * bt[l][j];
c[i][j] = suma;
}
printf("\nMultiplication of 2 matrices:\n");
for (i = 0; i < row1; i++) {
for (j = 0; j < col2; j++)
printf("%2d", c[i][j]);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
当我调试它时,它会在行和列中打印出随机数(类似于-895473)
缺少牙箍.
for (i = 0; i < row1; i++) {
for (j = 0; j < col2; j++) { // added brace
suma = 0;
for (l = 0; l < row2; l++) { // added brace
suma += a[i][l] * bt[l][j];
} // added brace
c[i][j] = suma;
} // added brace
}
Run Code Online (Sandbox Code Playgroud)
内部的牙箍并非绝对必要,但如果你总是使用牙箍,你将来不太可能犯这个特殊的错误.
没有大括号,它看起来像这样,正确缩进:
for (i = 0; i < row1; i++) {
for (j = 0; j < col2; j++)
suma = 0;
// Note that j = col2, which means that we are accessing
// array elements out of bounds, which is an error.
for (l = 0; l < row2; l++)
suma += a[i][l] * bt[l][j];
c[i][j] = suma;
}
Run Code Online (Sandbox Code Playgroud)
这显然是错误的.使错误不太可能的另一种方法是在循环内移动变量:
for (int i = 0; i < row1; i++) {
for (int j = 0; j < col2; j++) {
double suma = 0;
for (int l = 0; l < row2; l++) {
suma += a[i][l] * bt[l][j];
}
c[i][j] = suma;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,如果删除大括号,则会出现错误,因为j未定义.(这在C90中不起作用,但这些日子是古老的历史.)