从零开始学习C语言丨循环结构

2022-11-04 15:39:20 浏览数 (2484)
本文发布于微信公众号:三玹
首先,我们先来认识一下什么是循环?循环是在满足某个条件的情况下,让计算机帮忙重复执行某个命令或者某一块命令。
C语言中的循环结构包括了:for循环、while循环、do...while循环以及嵌套循环。
for循环
先来看一下 for 循环的语法结构:
for(init;condition;increment){
  statements;
}
for循环要具备的四个部分:
1、init:初始值。一般是变量赋值,只在第一次循环的时候才会被使用到,之后的每一次循环就用不到这个初始值。其作用是为了赋给后面的 condition 中进行判断。
2、condition:判断式。循环结构中的判断条件,第一次循环开始前接收 init 传过来的值,往后是接收 increment 传过来的值。判断是否成立,成立则开始循环,不成立就结束循环。
3、statements:执行语句。当 condition 里面的条件满足时,则会开始执行循环代码块里面的指令。
4、increment:增量表达式。每一次循环执行完语句后,都会调用 increment 中的命令,更新 init 定义的变量的值。然后传给 condition,继续循环。
接下来,我们来用 for 循环来打印 0-100 的内容:
for(int i=0;i<=100;i++){
  printf("%d", i);
}
第一个初始值,初始化了一个 int 类型的变量 i,并给它一个初始值 0。当然声明变量的行为,也可以在 for 循环之外定义的。
不过这两者是有区别的。for循环里面定义的称为临时变量,当for循环结束后,这个变量就从内存中删掉了,在循环结构之外使用变量 i 是会报错的;for循环外面定义的称为全局变量,即使循环结束,变量 i 还是存在,且此时的值是 101。


一般建议是在for循环中进行变量的初始化。
第二个判断式,判断 i 是否小等于100,是的话就执行下面的打印命令,不是的话就结束循环不再运行。
第三个执行语句,每循环一次都会执行一次打印命令,把此时 i 的值打印在控制台。
第四个增量表达式,每循环一次,i 变量就自增一次,然后传给判断式进行判断。以此往复 2-4 的内容。
那么有朋友要问,除了自增,我想自减行吗?
当然也是可以的。同样是打印0-100之间的数字,但是要求是从100开始。这时候初始值要初始化 i 变量的值是 100,判断式是小等于 0,增量表达式就可以使用自减 i--。
while循环
同样,while循环也是需要初始值,判断式,执行语句以及增量表达式。
语法结构:
int i = 0;
while(i <= 5){
  printf("%d", i);
  i++;
}

和 for 循环不同的是,while 的初始值得在循环体外面进行初始化,然后将初始化后的变量传递给 while 关键字后面括号里的条件判断式。

do...while循环
和while循环很相似,但又有不同。同时,do...while是一种比较特殊的循环结构,即便判断的条件不满足,都至少会执行一次循环体的内容
来看一个简单的例子:
int i = 0;
do{
  i++;
  printf("%d\n", i);
}while(i<0);
printf("%d", i);
如果按照 while 循环,首先会将初始化的 i 变量代入while后面的判断式。显然结果是不满足的,因此是不会执行代码块里面的内容。所以在while循环里面,这个案例只输出了一个 0。
但在do...while里,这段代码的结果输出是:1 1。
按照我的理解,计算机语言是按顺序执行的,那么do...while循环首先被执行的是 do 后面的代码块。因此,执行了一次累加和打印命令。
紧接着运行到while的判断式,结果不满足条件,该循环就结束了。
最后再执行代码块外面的打印命令,而此时变量 i 的值已经发生了改变,结果就是 1 1。
嵌套循环
循环结构同判断结构一样,也是可以进行嵌套(套娃行为)的。
例如:循环打印1-10中的所有值,在打印每一个值的时候,同时跟着要打印 3 个 1。(用for循环写)
for(int i=1;i<=10;i++){
  printf("%d",i);
  for(int j=1;i<=3;i++){
    printf("1");
  }
}
嵌套的行为在代码中建议是尽可能少用,一是影响代码的阅读性,二是会导致后期代码维护变得困难。
所以,嵌套这个行为尽可能少用;当不得不用的使用,也要尽可能少嵌套的层数,一般三个就差不多了。
关键字
C语言中有三个被应用在循环中的关键字,分别是:
break:用来终结循环的。
continue:用来跳过循环中符合某个条件的内容。
goto:用来把控制无条件转移到同一函数内被标记的语言。但这个关键字通常都不被建议使用,就不在这里展开了。
break 和 continue 在循环中通常需要和判断结构结合在一起使用
首先看一下 break 的使用。例如:我有一百个苹果,但我只需要从中拿出三个就够了。
for(int i=1;i<=100;i++){
  printf("你拿了%d个苹果。\n", i);
  if(i == 3){
    printf("你已经拿到3个苹果了,停手吧!");
    break;
  }
}
运行结果:
你拿了1个苹果。
你拿了2个苹果。
你拿了3个苹果。
你已经拿到3个苹果了,停手吧!
再来看一下 continue 的使用。例如:10 以内的数字,除了 3 的倍数的数字,其他都要打印出来。
int i=0;
while(i<10){
  if(i % 3 == 0){
    continue;
  }
  printf("%d", i);
}
运行结果:0124578
死循环
前面都是在满足条件的情况下发生,那么如果一直都不满足判断式的条件,那么结果会是怎么样呢?
答案很明显,就是会一直循环下去,永不停息。
这种情况就会导致程序一直在运行当中,不会正常结束。这种情况就类似于先帝创业未半,而中道崩殂。也就被称之为死循环
在程序中,一旦出现循环的判断条件一直处于满足的情况下,就要注意了。
死循环,一般都是要和 break 关键字结合在一起的,用来强行终止循环。
下面来看一下 for循环、while循环、do...while循环的死循环状态。
// for循环
for(int i=0; i < 1; ){
  printf("循环中...");
}
// while循环
while(1){
  printf("循环中...");
}
// do...while循环
do{
  printf("循环中...");
}while(1);
想要让循环成为了一个死循环其实很简单,只要保证循环中判断条件式的结果一直是为真,也就是符合条件的情况。
总结
关于循环结构的知识就讲到这里结束了,文中有什么不足之处,希望大家可以在评论区留下宝贵建议。下一篇,准备用学习的判断和循环结构来实现简单的算法——二分法以及冒泡排序。