矩阵左对角线求和代码异常:添加printf语句致结果错误
问题分析与解决方案
哥们,我一眼就揪出你代码里的核心问题了,跟那个printf语句本身没关系,是你的求和逻辑完全写错了!
先看你出问题的这段代码:
for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { if ( i == j) printf("%d\t",arr[i][j]);//This line is problematic** l_sum = l_sum + arr[i][j]; } }
不管i == j这个对角线条件成立不成立,你每次循环都会执行l_sum = l_sum + arr[i][j]——这等于把整个4x4矩阵里所有元素都加起来了,不是只加左对角线上的元素!
那为什么会出现“保留printf就错,删掉就对”的奇怪现象?大概率是你删除printf的时候,顺手把求和代码也调整到了if的条件块里(比如不小心加了大括号,把l_sum += arr[i][j]放进了if范围),这时候就只累加对角线元素了,自然得到正确结果5;而保留printf时,代码还是原样累加所有元素,得到的是整个矩阵的总和23。
修正后的代码
咱们把求和逻辑和对角线条件绑定,只在i == j的时候累加元素:
#include<stdio.h> #include<conio.h> int main() { int arr[4][4]; int i,j,l_sum=0; printf("\nENTER THE VALUE IN ARRAY:"); for(i=0;i<=3;i++) { for(j=0;j<=3;j++) scanf("%d",&arr[i][j]); } printf("The matrix is :\n"); for(i=0;i<=3;i++) { for(j=0;j<=3 ;j++) printf("% 4d",arr[i][j]); printf("\n"); } l_sum=0; for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { if (i == j) { printf("%d\t",arr[i][j]); // 现在只会打印对角线元素 l_sum = l_sum + arr[i][j]; // 只累加对角线元素 } } } printf("\nSUM OF LEFT DIAGONAL IS :%d\n", l_sum); return 0; }
或者更简洁点,利用左对角线i和j始终相等的特性,直接去掉内层循环:
l_sum=0; for(i=0;i<=3;i++) { printf("%d\t",arr[i][i]); l_sum += arr[i][i]; }
这样代码更清晰,也不容易踩坑。
总结
你的原代码错误在于求和逻辑没有和对角线条件绑定,那个printf只是背了锅——它的存在让你没注意到求和语句的位置错误,删掉它时你无意中调整了代码结构,才得到了正确结果。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

