第6章 C控制语句:循环
6.1 再探while循环(略)
6.1.1 程序注释(略)
6.1.2 C风格读取循环
while (scanf("%ld", &num) == 1)
{
/*循环行为*/
}
6.2 while语句
while 循环的通用形式:
while (expression)
statement
while 循环是 入口条件循环,满足条件时才进入循环体。
只有while(expression) 后的单独语句(或者{}扩起的语句块)才是
循环部分。
6.2.1 终止while循环
构建while循环时,测试表达式(即while后面的expression)的值 最终要为假。否则,就会出现“死循环”。
6.2.2 何时终止循环
6.2.3 while:入口条件循环
while循环是使用入口条件(entry condition)的有条件循环。入口条件是指,只要满足条件时才进入循环体,不满足时就直接跳过循环。
6.2.4 语法要点
只有测试条件后面的单独语句(大括号扩起的复合语句也是单独语句。空语句; 也是单独语句)才是循环部分。
int n = 0; while (n < 3) printf("n is %d\n", n); n++; //注意这句不是循环体的内容,n++不会执行,n<3一直成立,所以上面的循环会一直进行。
while( scanf("%d", &num) == 1) ; /*跳过整数输入*/
6.3 用关系运算符和表达式比较大小
while循环经常依赖测试表达式作比较,这样的表达式被称为 关系表达式(relation expression),
出现在关系表达式中的运算符叫做关系运算符(relation operator)。
在while语句中使用 关系表达式:
while( number < 6) { printf("Your number is too small.\n"); scanf("%d",&number); }
while(ch !='$') { count++; scanf("%c",&ch); }
while (scanf("%f", &num) ==1) sum += num;
使用关系运算符可以比较数字、字符,但不能直接比较字符串。 另外要注意,比较浮点数时一般使用< ,>,而不用==。因为由于浮点数精度问题会使原本相等的数在程序中不相等。
如果要比较两个浮点数是否相等,通常用这两个数作差,看它们的差是否足够小:
6.3.1 什么是真
简单来说,1是真,0是假
6.3.2 其他真值
不为0的数都是真值
6.3.3 真值的问题
看一个例子
int status; while (status = 1) { sum += num; printf("Enter next integer (q to quit):"); status = scanf("%ld", &num); }
本来这段代码是要在按下q的时候退出循环的,但是由于 将status == 1 错写成 status = 1,结果while后面的表达式 变成了一个赋值表达式,而这个赋值表达式的值是=左侧的值,即status的值,即1.即使进入循环体时输入q使得status的值变为0,进入while判断时又会执行一次status =1,结果无法退出循环。
避免这种错误的一个方法时 将 常数写在==左侧,例如 1 == status,这样如果漏写一个=,写成1=status的话,编译器就会报错。
6.3.4 新的_Bool类型 (_Bool)C99中的新变量类型 布尔类型,只有真(1)或假(0)两种值。
6.3.5 优先级和关系运算符
()优先级最高,使用()就可以。没必要写一些可读性很差、很长的表达式。
6.4 不确定循环和计数循环
一个简单的计数循环:
int count = 1; while (count <= 10) { printf("count=%d\n", count); count++; }
6.5 for循环
for的形式:
for (initialize; test; update )
statement
for循环的三个表达式 通常是第一个给计数器赋初始值,第二个表达式表示计数器范围
第三个表达式递增计数器。
实际使用可以灵活的利用三个位置的特点,
第1个表达式只在执行循环嵌执行一次,
第2个表达式可以是任何条件
第3个表达式是可以每次递增、递减、加倍等。
三个表达式可以空缺(但是分号不能缺)
6.6 其他赋值运算符(略)
6.7 逗号运算符
,逗号运算符扩展了for循环的灵活性,以便循环头中包含更多的表达式,
如:
for(ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
printf("%5d $%4.2f\n", ounces, cost/100.0 );
6.8 出口条件循环 do while (先做一次,再检查条件)
do
statement
while( expression);
6.9 如何选择循环
主要考虑是入口循环还是出口循环,
出口循环选do while , 入口循环for或while
6.10 嵌套循环
循环内的语句也是循环时,就形成嵌套循环。
以简单的二层嵌套为例,外层循环每执行一次,里面的语句(包括循环)就执行一遍。
for (row = 0; row < 5; row++) { for (ch = 'A'; ch < 'A'+10; ch++) { printf("%c", ch); } printf("\n"); }
这段代码里的ch会被打印5*10 次。
6.11 数组简介
6.12 使用函数返回值的循环示例