白驹过隙,这篇文章距今已有一年以上的历史。技术发展日新月异,文中的观点或代码很可能过时或失效,请自行甄别:)

在第5章徘徊了3天,主要是纠结在了for循环嵌套的地方,这也是目前我遇到的第一个瓶颈,在连续啃了无数的代码和网上相关的讲解终于突破了,把我自己的收获记录下来自己更加巩固下同时也希望和我一样的自学者在此陷入谜团的时候看到这篇文章能够走出这个误区,为了形象下我用第六章(数组)中的例6.4来讲解。
例:将一个二维数组行和列的元素互换,存到另一个二维数组中。

例如:
a=
1 2 3
4 5 6
b=
1 4
2 5
3 6
学习了数组我们就知道可以将a数组看成是a的一个二维数组,行和列分别就是a2,同理b3,然后我们就需要就a数组上每行每列上的数字换成b的每列每行上面,ok,用2个循环就可以搞定,可以选用while,do while 和 for循环,为了说明for循环的嵌套这里选用for循环,ok,编写程序:
Ps:和老谭书上的代码有小小的不同,但主体基本一样,在输出b数组时为了不让大家迷惑
(一开始我就是在这里一直不解),增加了2个字符来输出b数组

#include<stdio.h>
int main()
{
  int a[2][3]={{1,2,3},{4,5,6}};      //定义a数组
  int b[3][2],i,j,x,y;
  printf("array a:\n");
  for(i=0;i<=1;i++)       /*第7行到第16行是输出a数组到屏幕并互换a数组行和列的数字到b数组的列和行*/
   {
                  
   for(j=0;j<=2;j++)
       {
         printf("%d ",a[i][j]);
         b[j][i]=a[i][j];
        }
    printf("\n");/*这个printf是当内循环for执行完了后换行,也就是比如a的第一行的数字1,2,3这3个数                   字都输入完了后换行*/
   }          
  printf("array b:\n");
  for(x=0;x<=2;x++)//第18到24行这两个for循环是将b数组的值输出到屏幕
   {
    for(y=0;y<=1;y++)
     {
       printf("%d ",b[x][y]);
      }
    printf("\n");
   }
    return 0;

这段代码是这样运行的,先执行i=0的初始条件,然后i=0,符合条件i<=1,好了,执行其里面的语句,也就是内嵌for循环和printf语句,内循环for语句的初始条件为j=0,好了,运行printf("%d ",ai);也就是输出a0,接着执行bj=ai,即将a0的值赋予b0,好了,执行完了后执行内循环的表达式3,即j++,现在j=1,仍然符合j<=2的条件,好了,执行内循环的语句printf和bj=ai语句,将a0输出到屏幕并且将a0的值赋予b1,在执行表达式3,j++,在内循环表达式1,判断语句,内嵌循环的执行语句,这样一直执行,到了j=3时,不符合内嵌循环的循环条件了,好了,跳出内循环,执行for内循环下的printf语句,即换行,然后外循环i++,这时候i=1了,符合i<=1的条件,执行外循环的执行语句也就是行的代码了,内循环再次开始,j仍然从0开始,然后内循环一直执行直到j>2时不符合内循环j<=2的条件时跳出内循环,执行下个printf代码后执行外循环的表达式3,即i++,因为执行后i=2,大于1,于是也不符合外循环的条件,于是外循环结束,执行下一个代码,(具体的执行顺序下面给出)即 行的printf代码,在屏幕上输出array b:,执行完这个printf代码后可以看到下一个代码仍然是一个内嵌for循环的for循环,执行的顺序参照上面那个for循环嵌套,相信可以看懂。
另外在记录下,因为代码的执行顺序是从上到下的,所以表达式的前后顺序不能写反,否则执行的语句就不能按照你的意思来执行,不信的话可以将for循环里面第15行的printf("array b:\n")提到内循环for的前面即12行前试试效果。

附:第一个for循环嵌套的执行方法:

外循环a[0]
        屏幕上输出a[0][0],接着将a[0][0]的值付给b[0][0],执行下一个内循环
        屏幕上输出a[0][1],接着将a[0][1]的值付给b[1][0],执行下一个内循环
        屏幕上输出a[0][2],接着将a[0][2]的值付给b[2][0],执行下一个内循环
        不符合内循环执行条件,跳出内循环,执行换行后执行外循环
  外循环a[1]
            屏幕上输出a[1][0],接着将a[1][0]的值付给b[0][1],执行下一个内循环
            屏幕上输出a[1][1],接着将a[1][1]的值付给b[1][1],执行下一个内循环
            屏幕上输出a[1][2],接着将a[1][2]的值付给b[2][1],执行下一个内循环
           不符合内循环执行条件,跳出内循环,执行换行后执行外循环
  外循环a[2]
           不符合外循环条件,退出外循环,执行下一语句printf("array b:\n")