You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言传递二维数组至函数:矩阵对角线和差值计算异常问题

问题分析与修复方案

你的代码逻辑在计算两条对角线和的差值上是正确的,但有两个关键点可能导致你觉得它“仅对部分数值有效”:

1. Main函数返回值的显示问题

C语言中main函数的返回值会被操作系统当作程序的退出状态码,而大多数系统会将其视为无符号8位整数(范围0-255)。如果差值是负数,比如测试用例中的-3,系统会自动将其转换为253(-3 + 256 = 253),这会让你误以为计算结果错误。

2. 可能的需求误解:是否需要返回绝对值?

如果你的需求是返回两条对角线和的绝对值差值(比如|主对角线和 - 副对角线和|),当前代码返回的带符号结果就会不符合预期。

修复后的代码

我们可以调整代码逻辑,让结果显示更直观,同时提升代码可读性:

#include <stdio.h>
#include <stdlib.h>
#include <math.h> // 用于abs函数
#define N 2

// 计算两条对角线和的差值(主对角线和 - 副对角线和)
int SommaDIag(int mat[N][N]) { // 用二维数组形参更清晰,避免指针计算混淆
    int somma = 0;
    // 遍历主对角线:mat[rig][rig]
    for(int rig = 0; rig < N; rig++)
        somma += mat[rig][rig];
    // 遍历副对角线:mat[rig][N-1 - rig](右上到左下的常规逻辑)
    for(int rig = 0; rig < N; rig++)
        somma -= mat[rig][N-1 - rig];
    
    return somma;
}

int main(){
    int mat[N][N] = {{3, 2}, {6, 2}};
    int diff = SommaDIag(mat);
    
    // 直接打印结果,避免依赖main返回值的系统转换问题
    printf("两条对角线和的差值:%d\n", diff);
    // 如果需要绝对值差值,取消下面注释:
    // printf("两条对角线和的绝对值差值:%d\n", abs(diff));
    
    return 0; // main正常返回0,表示程序执行完成
}

关键改进点

  • 用int mat[N][N]作为函数形参,比int *mat更直观,可读性更强,也减少了指针计算出错的概率。
  • 副对角线的访问改为mat[rig][N-1 - rig],符合常规的副对角线遍历逻辑(从右上到左下)。
  • 在main中直接打印结果,避开了操作系统对退出码的转换问题,结果展示更准确。
  • 若需要绝对值差值,可使用abs()函数(需包含<math.h>头文件)。

测试验证

对于你的测试用例{{3,2},{6,2}}:

  • 主对角线和:3 + 2 = 5
  • 副对角线和:2 + 6 = 8
  • 差值:5 - 8 = -3,修复后的代码会直接打印-3;如果启用绝对值逻辑则打印3,完全符合预期。

对于奇数阶矩阵(比如N=3):

int mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
  • 主对角线和:1+5+9=15
  • 副对角线和:3+5+7=15
  • 差值:0,代码返回正确结果,中间元素5被加一次减一次,抵消后不影响最终结果。

内容的提问来源于stack exchange,提问作者Antonio Pavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:29