7.1 while循环

C语言学习栏目目录

目录

1、while语句

2、终止while循环

3、何时终止循环

4、入口条件循环

5、语法要点


 

1、while语句

while循环的通用形式如下:

while ( expression )
statement

statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。

到目前为止,程序示例中的expression部分都使用关系表达式。也就是说,expression是值之间的比较,可以使用任何表达式。如果expression为真(或者更一般地说,非零),执行  statement部分一次,然后再次判断expression。在expression为假(0)之前,循环的判断和执行一直重复进行。每次循环都被称为一次迭代(iteration),如图7.1所示。

2、终止while循环

while循环有一点非常重要:在构建while循环时,必须让测试表达式的值有变化,表达式最终要为假。否则,循环就不会终止(实际上,可以使用break和if语句来终止循环,但是你尚未学到)。考虑下面的例子:

index = 1;
while (index < 5)
    printf("Good morning!\n");

 上面的程序段将打印无数次 。为什么?因为循环中index的值一直都是原来的值1,不曾变过。现在,考虑下面的程序段:

index = 1;
while (--index < 5)
    printf("Good morning!\n");

这段程序也好不到哪里去。虽然改变了index的值,但是改错了!不过,这个版本至少在index减少到其类型到可容纳的最小负值并变成最大正值时会终止循环(最大正值加1一般会得到一个负值;类似地,最小负值减1一般会得到最大正值)。

3、何时终止循环

要明确一点:只有在对测试条件求值时,才决定是终止还是继续循环。例如,考虑程序清单中的程序。

/************************************************************************
功能:何时退出循环                                           
************************************************************************/
#include <stdio.h>
int main(void)
{
	int n = 5;
	while (n < 7)						// 第7行
	{
		printf("n = %d\n", n);
		n++;							// 第10行
		printf("Now n = %d\n", n);		// 第11行
	}
	printf("循环结束.\n");				//暂停控制台
	system("pause");
	return 0;
}

运行程序清单,输出如下

n = 5
Now n = 6
n = 6
Now n = 7
循环结束.
请按任意键继续. . .

在第2次循环时,变量n在第10行首次获得值7。但是,此时程序并未退出,它结束本次循环(第11行),并在对第7行的测试条件求值时才退出循环(变量n在第1次判断时为5,第2次判断时为6)。

4、入口条件循环

while循环是使用入口条件的有条件循环。所谓“有条件”指的是语句部分的执行取决于测试表达式描述的条件,如(index < 5)。该表达式是一个入口条件(entry condition),因为必须满足条件才能进入循环体。在下面的情况中,就不会进入循环体,因为条件一开始就为假:

index = 10;
while (index++ < 5)
    printf("Have a fair day or better.\n");

把第1行改为:

index = 3;

就可以运行这个循环了。

5、语法要点

使用while时,要牢记一点:只有在测试条件后面的单独语句(简单语句或复合语句)才是循环部分。程序清单演示了忽略这点的后果。缩进是为了让程序员阅读方便,不是计算机的要求。

/************************************************************************
功能:糟糕的代码创建了一个无限循环
************************************************************************/
#include <stdio.h>
int main(void)
{
	int n = 0;
	while(n < 3)
		printf("n is %d\n", n);
	n++;
	printf("程序运行完成\n");//无限循环不需要停止控制台
	return 0;
}

该程序的输出如下:

屏幕上会一直输出以上内容,除非强行关闭这个程序。虽然程序中缩进了n++;这条语句,但是并未把它和上一条语句括在花括号内。因此,只有直接跟在测试条件后面的一条语句是循环的一部分。变量n的值不会改变,条件n < 3一直为真。该循环会一直打印n is 0,除非强行关闭程序。这是一个无限循环(infinite loop)的例子,没有外部干涉就不会退出。

记住,即使while语句本身使用复合语句,在语句构成上,它也是一条单独的语句。该语句从while开始执行,到第1个分号结束。在使用了复合语句的情况下,到右花括号结束。要注意放置分号的位置。例如,考虑下面程序清单

#include <stdio.h>
int main(void)
{
	int n = 0;
	while (n++ < 3);				//第7行
		printf("n is %d\n", n);		//第8行
	printf("程序运行完成!.\n");
	system("pause");				//暂停控制台
	return 0;
}

 该程序的输出如下:

n is 4
程序运行完成!.
请按任意键继续. . .

如前所述,循环在执行完测试条件后面的第 1 条语句(简单语句或复合语句)后进入下一轮迭代,直到测试条件为假才会结束。该程序中第7行的测试条件后面直接跟着一个分号,循环在此进入下一轮迭代,因为单独一个分号被视为一条语句。虽然n的值在每次循环时都递增1,但是第8行的语句不是循环的一部分,因此只会打印一次循环结束后的n值。

在该例中,测试条件后面的单独分号是空语句(null statement),它什么也不做。在C语言中,单独的分号表示空语句。有时,程序员会故意使用带空语句的while语句,因为所有的任务都在测试条件中完成了,不需要在循环体中做什么。例如,假设你想跳过输入到第1个非空白字符或数字,可以这样写:

while (scanf("%d", &num) == 1)
; /* 跳过整数输入 */

只要scanf()读取一个整数,就会返回1,循环继续执行。注意,为了提高代码的可读性,应该让这个分号独占一行,不要直接把它放在测试表达式同行。这样做一方面让读者更容易看到空语句,一方面也提醒自己和读者空语句是有意而为之。

 

源码

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页