C语言图案生成代码疑问:为何输出与预期不符?
理解C语言嵌套循环生成目标图案的逻辑
问题背景
我想要用C语言生成如下图案:
1 1 2 1 3 1 1 2 2 2 3 2 1 3 2 3 3 3 1 4 2 4 3 4 1 5 2 5 3 5
参考了一段代码:
#include <stdio.h> int main () { int i; int j; for (i = 1 ; i <= 5 ; i++) { for (j = 1 ; j <= 3 ; j++) { printf("%i %i",j,i); } printf("\n"); } return 0; }
但我不明白为什么这段代码输出的是上面的目标图案,而不是我预想的:
1 2 3 1 1 2 3 2 1 2 3 3 1 2 3 4 1 2 3 5
代码执行逻辑拆解
核心要搞懂嵌套循环的执行顺序和每次printf的输出内容:
- 外层循环
for (i = 1 ; i <= 5 ; i++)控制输出的行数,i从1到5对应5行,每轮外层循环结束后执行printf("\n")换行。 - 内层循环
for (j = 1 ; j <= 3 ; j++)控制每行的输出内容,每轮内层循环会执行3次printf("%i %i",j,i):- 当
i=1(第一行)时,j依次取1、2、3,分别输出1 1、2 1、3 1,拼接后就是第一行的1 1 2 1 3 1。 - 当
i=2(第二行)时,j依次取1、2、3,分别输出1 2、2 2、3 2,拼接后就是第二行的1 2 2 2 3 2。 - 以此类推,每一行的
i值固定,内层循环每次输出j和当前的i,所以每行都是三组j值+空格+i值的组合。
- 当
你预想图案的实现逻辑
你预想的图案是每行先输出1、2、3,再输出当前行号i,但原代码的printf是每次输出两个值(j和i),而非先输出所有j再输出i。如果要得到你预想的图案,代码应该改成:
#include <stdio.h> int main () { int i; int j; for (i = 1 ; i <= 5 ; i++) { // 先输出1、2、3 for (j = 1 ; j <= 3 ; j++) { printf("%i ",j); } // 再输出当前行号i printf("%i\n",i); } return 0; }
内容的提问来源于stack exchange,提问作者Fady Saad
相关产品推荐
相关产品推荐

