为何下述C语言代码输出不符合预期?求问题原因排查
问题分析与解决
代码核心问题
你的矩阵转置逻辑存在重复交换的错误:双重循环遍历了所有i和j的组合,导致每一对非对角线元素被交换两次,最终又回到初始状态。同时对角线元素(i=j时)的自交换属于无意义操作。
输出对比
- 预期的转置输出(原矩阵行转列):
135 246 797 - 代码实际输出(与原矩阵完全一致):
127 349 567
原因解释
举个例子:当i=0,j=1时,你交换了a[0][1]和a[1][0];但当循环走到i=1,j=0时,又会把这两个元素交换回去。所有非对角线元素都经历了两次交换,等于没有改变;对角线元素自交换后值不变,最终矩阵和原矩阵完全相同,输出自然和原矩阵遍历结果一致。
修正后的代码
只需要让内层循环从j = i + 1开始,避免重复交换,同时将转置操作和输出操作分离,逻辑更清晰:
#include <stdio.h> int main() { int a[3][3] = {{1, 2, 7}, {3, 4, 9}, {5, 6, 7}}; int temp; // 完成矩阵转置,仅交换上三角与下三角元素 for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 3; j++) { temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } } // 遍历输出转置后的矩阵 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d", a[i][j]); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Nirbhay
相关产品推荐
相关产品推荐

