«

什么这里 x 需要 -1

灯点亮 发布于 阅读:61 C++


你的观察很到位!让我详细解释一下为什么这里 x 需要 -1,以及整个逻辑应该如何调整。

原始问题分析
原始代码中:

cpp
int a[3][4] = {
{91, 99, 80}, // 第4列未初始化(自动补0)
{92, 98, 100}, // 第4列未初始化
{98, 85, 99} // 第4列未初始化
};
int y = sizeof(a) / sizeof(a[0]); // y = 3(行数)
int x = sizeof(a[0]) / sizeof(a[0][0]); // x = 4(列数)
然后在循环中:

cpp
for (int j = 0; j < x; j++) { // j会从0循环到3(共4列)
c = c + a[i][j]; // 这里会把第4列的初始值(0)也加进去
cout << a[i][j] << '\t';
a[i][3] = c; // 每次循环都覆盖第4列的值
}
问题所在
第4列被重复计算:因为 x=4,内层循环会遍历所有4列,包括存储总和的第4列。第一次循环时 a[i][3] 是0,会被加到 c 中,然后又被赋值为 c,导致逻辑混乱。

每次循环都覆盖总和:a[i][3] = c 放在内层循环中,会导致每次循环都更新第4列的值,而不是在最后存储总和。

正确做法
x 应该是有效数据列数(不包括总和列),所以 x = 列数 - 1 = 3。

总和计算应放在内层循环之后,只执行一次。

修正后的代码
cpp

include

using namespace std;

int a[3][4] = {
{91, 99, 80, 0}, // 第4列初始化为0,用于存储总和
{92, 98, 100, 0},
{98, 85, 99, 0}
};

int main() {
int y = sizeof(a) / sizeof(a[0]); // y = 3(行数)
int x = sizeof(a[0]) / sizeof(a[0][0]) - 1; // x = 3(前3列是数据,第4列存储总和)

for (int i = 0; i < y; i++) {
    int c = 0;
    // 只遍历前x列(不包含总和列)
    for (int j = 0; j < x; j++) {
        c += a[i][j];
        cout << a[i][j] << '\t';
    }
    a[i][x] = c; // 将总和存入第4列(索引x=3)
    cout << a[i][x] << endl; // 输出总和
}

system("pause");
return 0;

}
为什么 x 要 -1?
sizeof(a[0]) / sizeof(a[0][0]) 计算的是总列数(这里是4列)。

但我们只需要遍历前3列来计算总和,第4列是存储结果的,不应该参与计算。

所以 x = 总列数 - 1 = 3,这样 j 的循环范围是 0 ≤ j < 3,即只遍历前3列。

最终输出
text
91 99 80 270
92 98 100 290
98 85 99 282
这样逻辑就正确了!🚀