C语言学习笔记系列—第六章

1,While循环

在第五章的时候已经简单介绍和使用了While循环,下边程序做了一个求和运算(整型运算),结束循环使用的是利用scanf()的返回值来结束循环。

#include <stdio.h>
int main(void)
{
	long num;
	long sum = 0L;      //首先声明sum初始值设置为0,此处使用了long类型(0L)
	int status;

	printf("Please enter an integer to be summed ");
	printf("(q to quit): ");
	status = scanf("%ld", &num);
	while (status == 1)     //使用了==运算符号,这个是真的等于号。
	{
		sum = sum + num;
		printf("Please enter next integer (q to quit): ");
		status = scanf("%ld", &num);
	}
	printf("Those integers sum to %ld.\n", sum);

	return 0;
}

上述程序中使用了==符号,在之钱篇章中强调了很多次关于“=”是赋值的意思。其次在使用sum声明类型中使用long类型是为了存储更大的整数,所以将sum初始化为0L(long类型的0),而不是0(int类型的0)。程序结果如下:

Please enter an integer to be summed (q to quit): 44
	Please enter next integer (q to quit): 336
	Please enter next integer (q to quit): q
Those integers sum to 435.

这个循环程序是根据测试条件status ==1,只要status等于1,循环就会重复。每次循环,num的当前值都被加到sum上,这样sum的值始终是当前整数之和。当status的值不为1时,循环结束。这个程序有意思的就在于status的值是怎么变化的:

1,如果scanf()成功读取一个整数,就把该数存入num并返回1,随后返回值将被赋给status(注意,用户输入的值存储在num中,不是status中)。这样做同时更新了num和status的值,while循环进入下一次迭代。

2,如果用户输入的不是数字(如,q或者任何其他字符),scanf()会读取失败并返回0。此时,status的值就是0,循环结束。

上述方式比较费脑子,其实有简单的办法退出循环也就是在循环中添加代码,例如每次循环时询问用户“是否继续循环?<y/n>”,然后判断用户是否输入y。这个办法虽然有点蠢,但Linux以及很多网络设备中仍然使用这种方法选择是否进入下一步。

因此总结来看while循环是入口条件循环,程序在进入循环体之前必须获取输入的数据并检查status的值(作为一种条件),所以在while前面要有一个输入并且不一定是scanf。要让循环继续执行,在循环内需要一个读取数据的语句,这样程序才能获取下一个条件的值。

1.1,终止循环(while)

while循环有一点非常重要:在构建while循环时,必须让测试表达式的值有变化。否则,循环就不会终止(会让程序一直循环下去直到计算机卡死)。

1.2,入口条件循环

在1.2中总结描述了while需要入口在才能进行循环操作,也就是所谓“有条件”指的是语句部分的执行取决于测试表达式描述的条件,如(a < 6)。所以在日常使用中可以使用C语言中的运算关系来进行使用条件(类似大于、小于、等于、不等于、不大于等于等等)。

2,for循环

for循环与while循环中的三个行为写在了一起;

for (size_t i = 0; i < count; i++)

for循环的第1行包含了循环所需的所有信息:i的初值,i的终值(循环的出口条件)和每次循环i的增量。

用下边的程序来举例让大家更简单认识for循环:

#include <stdio.h>
int main(void)
{
	int i;
	for (i = 0; i < 11; i++)
		 printf("%d seconds!\n", i);
	return 0;
}

下面程序的运行结果:

这个程序每次对i进行累加,累加到10后退出for循环。

当然for的写法还有很多,比如下面的写法:

#include <stdio.h>
int main(void)
{
	int x;
	int y = 0;

	for (x = 0; y <= 75; y = (++x * 5) + 50)
		printf("%10d %10d\n", x, y);
	return 0;
}

该循环打印x的值和表达式++x * 5 + 50的值,程序的输出如下:

所以for语言的写法相对简便,for语句是一种入口条件循环,即在执行循环之前就决定了是否执行循环。

3,do while循环

while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有一种条件循环,即在循环的每次迭代之后检查测试条件,至少执行循环体中的内容一次。

这种循环被称为do while循环,通用的表达式为以下公式:

do
   statement
while ( expression );

do while循环在执行完循环体后才执行测试条件,所以至少执行循环体一次;而for循环或while循环都是在执行循环体之前先执行测试条件。do while循环适用于那些至少要迭代一次的循环。

4,选择一个适用的循环

首先,确定是需要入口条件循环还是出口条件循环。通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。

这就是为什么需要在讲do while时候用的篇幅较小,主要讲解for和while。

一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于下面这种条件,用while循环就很合适:

while (scanf("%ld", &num) == 4)

对于涉及索引计数的循环,用for循环更适合。例如:

for (count = 0; count <= 200; count++)

滚动至顶部