有人可以解释为什么这段代码不适用于最后一个元素?
#include <iostream>
using namespace std;
void main(){
const int n = 10, m = 10;
int asd[n][m] = {
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 } };
int sum = 0;
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][m] << endl;
sum += asd[i][m];
}
cout << "Sum of first col " << sum << endl;
}
如果我删除n
和m
,并设置数组asd[10][10]
- 这样可行,为什么?
答案 0 :(得分:3)
因为您在最后一次迭代中打印了一个超出范围的元素(并且可能在前面的元素中使每个元素都出错)
cout << "Array[" << i << "] => " << asd[i][10] << endl;
^^
这将起作用(假设我正确地解释了你想要做的事情):
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][0] << endl;
sum += asd[i][0];
}
cout << "Sum of first col " << sum << endl; // 10
奖金提示:
main应返回int:
int main() {
使用using namespace std;
会污染全局命名空间
答案 1 :(得分:1)
更改此循环
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][m] << endl;
sum += asd[i][m];
}
到
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][0] << endl;
sum += asd[i][0];
}
前提是您正在计算第一列元素的总和。
考虑到函数main应具有返回类型int
int main()
至于你的问题,那么你的程序有不确定的行为。例如表达式
asd[0][m]
相当于asd[1][0]
。
和表达式asd [9] [m]等同于asd [10] [0]。所有这些都取决于数组之外的内存中存储的内容。
答案 2 :(得分:0)
由于数组仅包含10行,因此只有你的索引才会达到9.因此它将超出范围
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][m] << endl;
sum += asd[i][m];
}
到
for (int i = 0; i < n; i++){
cout << "Array[" << i << "] => " << asd[i][0] << endl;
sum += asd[i][0];
}
如果要打印所有列总和,则可以使用以下代码
for (int j=0;j<m;j++){
int sum=0;
for (int i = 0; i < n; i++){
sum += asd[i][j];
}
cout << "Sum of" << j <<"col " << sum << endl;
}