仅当两个代码块不同时,两个代码才相似M
,N
否则equal
两个代码块都不同。
Case-1 :-查看下面的代码块
int sum_array_rows(int a[M][N]) {
int i,j,sum=0;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
sum+=a[i][j];
return sum;
}
这是一个由行和列a
组成的数组,您正在对每个行列元素进行求和。这是一个很好的代码,因为外循环旋转等于行数,内循环旋转等于列数。M
N
sum+=a[i][j]
Case-2 :- 现在看第二个代码块,它会导致溢出。
int sum_array_rows(int a[M][N]) {
int i,j,sum=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum+=a[i][j];
return sum;
}
这里也是一个行和列a
的数组。您的第一个外部 for 循环从to旋转,但您只有行。当你这样做时,如果&不一样,它会产生一个大问题。例如, is和is即它的 like 和外循环从to迭代,你继续做M
N
0
N
M
sum+=a[i][..]
M
N
M
2
N
5
int a[2][5]
0
5
所以以上两个代码块只有当M
和相同时才N
相同,否则两者不同。
首先第二个代码块是错误的,但你可以通过做sum+=a[j][i]
而不是更正它sum+=a[i][j]
as
int sum_array_rows(int a[M][N]) {
int i,j,sum=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum+=a[j][i];
return sum;
}
正如其他人所说,由于 2D 数组的内存布局和缓存系统的工作方式,第一个版本可能比第二个版本执行得更好。另一方面,编译器可能会优化这两个版本以使其性能相同。