C语言中的循环控制

目录

  • 循环语句的应用场景
  • do语句
  • while语句
  • for语句
  • 写在最后的话

​ 在我介绍分支结构的那篇文章中,我提到了程序设计的三种结构,即顺序结构分支结构循环结构,今天我们就来详细的谈谈循环结构在程序设计中的具体应用。

循环语句的应用场景

​ 我们在写程序的时候一定会遇到需要重复执行某条或某些指令的场景。例如:要在屏幕上打印1~100的数值,你会怎么编写程序呢?请看下面的代码:

#include <stdio.h>

int main()
{
	printf("%d ", 1);
	printf("%d ", 2);
	printf("%d ", 3);
	printf("%d ", 4);
	printf("%d ", 5);
	…… ……
	printf("%d ", 97);
	printf("%d ", 98);
	printf("%d ", 99);
	printf("%d ", 100);

	return 0;
}

​ 显然这么做很耗费时间,而敲这些代码并不会让你的编程技术有所精进,最多也就是练习一下打字速度罢了。我们发现,这类程序都有一个共同的特点,那就是重复做相同的行为,而这种重复相同的行为,并不是人类所擅长的,又恰恰是计算机所喜欢的。既然这样,那可不可以设计一种语法,完成这种重复的动作呢?于是循环结构就诞生了……

do语句

​ do语句的工作原理可以用一句话总结"不管三七二十一,上来就是干",他这样的特性适合一些特别的用处,比如:验证输入的合法性

/* do语句的基本结构 */
do
{
    //循环体
    statement;
}while(判断表达式);

​ 在程序的编写中,我们经常会希望用户输入指定范围的数值,比如一个判断,对输入年龄是少年、青年、中年、老年的程序,很显然,人的年龄不可能是负数,也没有人可以活到150岁。对于这样的程序,我们就可以通过do语句来控制用户输入数值的范围,如:

#include <stdio.h>

int main()
{
	int age = 0;
    do
    {
        printf("请输入需要判断的年龄->");
        scanf("%d", &age);
    }while(age < 0 && age > 150);  // 若不是合法范围,则重新输入

	return 0;
}

​ 这样我们就完成了对输入值范围的限定,而一个健壮的程序,对输入的合法性验证是不可或缺的。

while语句

​ 上面的do循环,至少执行一次,而有些情况,我们只希望其满足条件是执行,反之则不执行,像这种情况往往需要先执行判断表达式,再执行循环体。while语句就是这样设计的。

/* while语句的基本结构 */
#include <stdio.h>

int main()
{
    while (判断表达式)
    {
        statement;
    }
    
    return 0;
}

​ while语句总是优先执行判断表达式,然后再决定是否执行循环体。例:

/* 代码一 */
#include <stdio.h>

int main()
{
    int i = 0;
    while (i < 0)
    {
        printf("%d", i);
        i--;  //调整部分
    }
    
    return 0;
}
/* 代码二 */
#include <stdio.h>

int main()
{
    int i = 1;
    while (i <= 100)
    {
        printf("%d", i);
        i++;  //调整部分
    }
    
    return 0;
}

​ 显然代码一的循环一次都不会执行,因为,不满足判断表达式的条件,根本就不会进入循环;代码二会在屏幕上打印1~100的数值。从这两个例子中,我们都能看到调整部分的,这是因为循环再多次,他也是要结束的,没有调整部分,就会构成死循环,而我们刚开始学习循环,最容易忘记的就是调整部分!

for语句

​ 在前面的while语句中,我们提到了调整部分,我们可以看到,while语句的初始化、判断、调整三个部分是非常分散的,为了应对这个问题,就诞生了应用最多的循环——for循环

/* for循环的基本结构 */
#include <stdio.h>

int main()
{
    for (初始化; 判断表达式; 调整)
    {
        statement;
    }
    
    return 0;
}

​ 我们可以到for语句将三个部分整合的非常集中,寻找其一变得非常容易,且不会出现漏写的情况。用for循环解决开头的问题:

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 100; i++)
    {
        printf("%d ", i);
    }
    
    return 0;
}

​ 可以发现,同样可以完美解决问题,并且代码变得更整洁了。

写在最后的话

​ 我们已经有了解决重复执行相同动作的方法,并且不止一种,如果你要问那种是最好的?我想说的是,其实这个世界的一切,包括我们自己不是只有两种选择,要么做要么不做,要么对要么错,要么好要么坏。大家观察无论是再好的人也有他的缺点,再坏的人也有他的优点,再不好的事也有它的益处,再好的事也有它的弊端。所以这个世界的一切除了黑与白、曲与直,还存在着第三种乃至无数种可能,只是我们被固有的二元思维模式所束缚,看不到事情的其它面向而已。所以,这三种循环各有各的优点,也各有各的缺陷,而作为程序撰写者的我们,只需要根据具体面临的问题,来选择使用哪种循环!