方阵中排除对角线元素求和的代码错误排查
问题分析与修复
你的代码存在两个核心问题:对角线判断逻辑错误,以及循环内的元素跳过逻辑错误,导致计算结果不符合预期。
1. 对角线判断函数完全错误
你写的isRightDiagonal和isLeftDiagonal函数里,犯了两个低级错误:
- 误用赋值运算符
=代替相等判断==,这会直接修改变量值,而非进行条件判断 - 对角线的判断公式完全错误:
- 左上到右下的主对角线:正确条件是
row == col(行号等于列号) - 左下到右上的副对角线:正确条件是
row + col == size - 1(行号加列号等于矩阵边长减1)
- 左上到右下的主对角线:正确条件是
2. 循环内的跳过逻辑错误
当判断到元素在对角线上时,你执行col++后依然执行count += mat[row][col],这会导致:
- 没有跳过当前对角线元素,反而错误累加了下一个元素
- 如果
col已经是最后一列(size-1),col++会触发数组越界,引发未定义行为
正确的做法是用continue直接跳过当前循环,不执行累加操作。
修正后的代码
#include <stdbool.h> // 需包含此头文件以使用bool类型 bool isRightDiagonal(int size, int row, int col) { return row == col; // 主对角线判断:行号等于列号 } bool isLeftDiagonal(int size, int row, int col) { return row + col == size - 1; // 副对角线判断:行号+列号=边长-1 } int calculateVal(int **mat, int size) { int count = 0; for (int row = 0; row < size; row++) { for (int col = 0; col < size; col++) { if (isRightDiagonal(size, row, col) || isLeftDiagonal(size, row, col)) { continue; // 跳过对角线元素,直接进入下一次循环 } count += mat[row][col]; } } return count; }
验证结果
对于5x5全1的矩阵:
- 总元素数25,两条对角线共有
5+5-1=9个元素(中间元素重复) 25-9=16,与预期结果一致- 全2的矩阵会得到
16*2=32,符合预期
内容的提问来源于stack exchange,提问作者Noah Nininger
相关产品推荐
相关产品推荐

