while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环(exit-condition loop),即在循环的每次迭代之后检查测试条件,这保证了至少执行循环体中的内容一次。
入口条件循环:while
while语句创建了一个循环,重复执行直到测试表达式为假或0。while语句是一种入口条件循环,也就是说,在执行多次循环之前已决定是否执行循环。因此,循环有可能不被执行。循环体可以是简单语句,也可以是复合语句。
格式:
while(表达式expression)
{
循环体statement;
}
运行顺序:
当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这个就是 while 的执行顺序。
注意,初学者编程时,if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加“{}”,养成良好的编程习惯尤为重要。
#include<stdio.h>
int main(void)
{
long num;
long sum=0L;
int status;
printf("Please enter an integer to be summed(q to quit):\n");
status=scanf("%ld",&num);
while(status==1)
{
sum=sum+num;
printf("Please enter an integer to be summed(q to quit):\n");
status=scanf("%ld",&num);
}
printf("Sum is %ld",sum);
getchar();
getchar();
return 0;
}
总之,因为while循环是入口条件循环,程序在进入循环体之前必须获取输入的数据并检查status的值,所以在 while 前面要有一个 scanf()。要让循环继续执行,在循环内需要一个读取数据的语句,这样程序才能获取下一个status的值,所以在while循环末尾还要有一个scanf(),它为下一次迭代做好了准备。
关系运算符
< 小于
> 大于
<= 小于或等于
== 等于
>= 大于或等于
!= 不等于
优先级
关系运算符之间有两种不同的优先级
高优先级组: <<= >>=
低优先级组: == !=
:
关系表达式
关系为真,关系表达式的值为1;关系为假,关系表达式的值为0
入口条件循环:for
for语句使用3个表达式控制循环过程,分别用分号隔开。initialize表达式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真(或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。for语句是一种入口条件循环,即在执行循环之前就决定了是否执行循环。因此,for循环可能一次都不执行。statement部分可以是一条简单语句或复合语句。
格式:
for(表达式1initialize;表达式2test;表达式3update;)
statement
1.用于初始化,只用一次 2.判断 3.遍历(i=i+1)
二者联系
在 for 循环的格式中,表达式 1、表达式 2 和表达式 3 在 while 循环中一个也不少,只不过不像 for 循环那样写在一起,而是分开写。在 while 循环中,循环变量 i 在定义的时候就给它赋初值,++i 则是写在 while 的循环体内。只有循环判断表达式与 for 一样,都是写在其后的括号中。
那么,是不是所有的 for 循环都可以转化成 while 循环?答案是“Yes”!不仅如此,所有的 while 循环也都可以转化成 for 循环,for 循环和 while 循环可以相互转换。
当程序中需要用到循环结构时,for 循环和 while 循环都可以使用,具体如何选择要根据实际情况分析。比如死循环往往就是用 while(1),这样更方便!
二者区别
一、循环的结构不同
for循环的表达式为:
for(单次表达式;条件表达式;末尾循环体)
{
中间循环体;
}
while循环的表达式为:
while(表达式)
{
循环体;
}
二、执行条件的判断方式不同
for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。
while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。
三、使用的目的不同
for循环的目的是为了限制循环体的执行次数,使结果更精确。
while循环的目的是为了反复执行语句或代码块。
四、语法不同
for循环的语法为:for (变量 = 开始值;变量<= 结束值;变量 = 变量 + 步进值) {需执行的代码 }。
while循环的语法为:while (<条件>) {需执行的代码 }。
出口条件循环:do while
do while 语句创建一个循环,在 expression 为假或 0 之前重复执行循环体中的内容。do while语句是一种出口条件循环,即在执行完循环体后才根据测试条件决定是否再次执行循环。因此,该循环至少必须执行一次。statement部分可是一条简单语句或复合语句。
格式
do
{
statement;
}while(expression);
如何选择循环?
如何选择使用哪一种循环?首先,确定是需要入口条件循环还是出口条件循环。通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。
那么,假设需要一个入口条件循环,用for循环还是while循环?这取决于个人喜好,因为二者皆可。要让for循环看起来像while循环,可以省略第1个和第3个表达式。例如:
for ( ; test ; )
与下面的while效果相同:
while ( test )
要让while循环看起来像for循环,可以在while循环的前面初始化变量,并在while循环体中包含更新语句。例如:
初始化;
while ( 测试 )
{
其他语句更新语句
}
与下面的for循环效果相同:
for ( 初始化 ;测试 ; 更新 )
其他语句
一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于下面这种条件,用while循环就很合适:
while (scanf("%ld", &num) == 1)
对于涉及索引计数的循环,用for循环更适合。例如:
for (count = 1; count <= 100; count++)
嵌套循环
指一个循环内包含另一个循环
嵌套循环中的内层循环在每次外层循环迭代时都执行完所有的循环
6.17
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main(void)
{
int row;
char ch;
for(row=0;row<ROWS;row++)
{
for(ch='A';ch<('A'+CHARS);ch++)
printf("%c",ch);
printf("\n"); //换行
}
getchar();
getchar();
return 0;
}
6.18
#include<stdio.h>
int main(void)
{
const int ROWS=6;
const int CHARS=6;
int row;
char ch;
for(row=0;row<ROWS;row++)
{
for(ch=('A'+row);ch<('A'+CHARS);ch++) //对ch重新初始化
printf("%c",ch);
printf("\n");
}
getchar();
getchar();
return 0;
}
多个循环是否可以合并成一个循环?
可以。合并后的程序显得更加紧凑。但是,调整时要注意遵循模块化(modularity)的原则。模块化隐含的思想是:应该把程序划分为一些独立的单元,每个单元执行一个任务。这样做提高了程序的可读性。也许更重要的是,模块化使程序的不同部分彼此独立,方便后续更新或修改程序。在掌握如何使用函数后,可以把每个执行任务的单元放进函数中,提高程序的模块化。
continue语句
作用:
执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果其在嵌套循环之内,只会影响包含该语句的内层循环。
应用:
所用循环都可以使用,但是switch语句不行。
优点:
a.减少主语句组中的一级缩进。当语句很长或嵌套较多时,紧凑简洁的格式提高了代码的可读性。
b.用作占位符,提高可读性。
while(getchar() !='\n')
;
改进:
while(getchar() !='\n')
continue;
continue语句让程序跳过循环体的余下部分,那么,从何处开始继续循环?
对于while和do while循环,执行continue语句后的下一个行为是对循环测试表达式求值。
对于for循环,执行continue后的下一个行为是对更新表达式求值,然后是对循环测试表达式求值。
对于while和for循环,程序执行到continue语句后会开始进入下一轮迭代。
对于do while循环,对于出口条件求值后,如有必要会进入下一轮迭代。
break语句
作用:
程序执行到循环中的break语句时,会终止包含它的循环,并继续执行下一阶段。如果break语句位于嵌套循环内,它只会影响包含它的当前循环。break还可用于因其他其他原因退出循环的情况。
应用:
所有的循环和switch语句都可以使用break语句。