C控制语句:循环
1.while循环
(1.)何时终止循环
程序示例1.1:
#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(“The loop has finished.\n”);
return 0;
}
运行程序,输出如下:
n = 5
Now n = 6
n=6
Now n = 7
The loop has finished.
在第2次循环时,变量n在第10行首次获得值7。但是,此时程序并未退出,它结束本次循环(第11行),并在对第7行的测试条件求值时才退出循环(变量n在第1次判断时为S,第2次判断时为6)。
(2.)while: 入口条件循环
while循环是使用入口条件的有条件循环。所谓“有条件”指的是语句部分的执行取决于测试表达式描述的条件,如(index < 5)。该表达式是一个入口条件(entry condition),因为必须满足条件才能进入循环体。在下面的情况中,就不会进入循环体,因为条件一开始就为假:
index=10;
while (index++ < 5)
printt(“Have a fair day or better.\n”);
把第1行改为: Index = 3;
就可以运行这个循环了。
(3.)用关系运算符和表达式比较大小
while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式(relational expression),出现在关系表达式中间的运算符叫做关系运算符(relational operator)。前面的示例中已经用过一些关系运算符,表1.2列出了C语言的所有关系运算符。该表也涵盖了所有的数值关系(数字之间的关系再复杂也是有人与人之间的关系复杂)。
表1.2:
运算符 | 含义 |
---|---|
< | 小于 |
<= | 小于或等于 |
== | 等于 |
>= | 大于或等于 |
> | 大于 |
!= | 不等于 |
关系运算符常用于构造while语句和其他C语句中用到的关系表达式。这些语句都会检查关系表达式为真还是为假。下面有3个互不相关的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 = sum + num;
注意,第2个while语句的关系表达式还可用于比较字符。比较时使用的是机器字符码(例如:ASCII码)。但是,不能用关系运算符比较字符串。
虽然关系运算符也可用来比校浮点数,但是要注意比较浮点数时,尽量只使用<和>。因为浮点数的舍入误差会导致在逻辑上应该相等的却不相等。例如3乘以1/3的积是1.0。如果用把1/3表示成小数点后面6位数字,乘积则是.999999,不等于1。使用fabs()函数(声明在math.h头文件中)可以方便地比较浮点数,该函数返回一个浮点值的绝对值(即没有代数符号的值)。
2.新的_Bool类型
在C语言中,一直用int类型的变量表示真/假值。C99专门针对这种类型的变量新增了_Bool 类型。该类型是以英国数学家George Boole的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable), 所以_Bool类型是C语言中布尔变量的类型名。_Bool类型的变量只能储存1 (真)或0 (假)。如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1。这反映了C把所有的非零值都视为真。
把int类型的变量status替换成_Bool类型的变量input_is_good。给布尔变量取一个能表示真或假值的变量名是一种常见的做法。
程序1.3 boolean.程序
//boolean.c – 使用_bool类型的变量variable
#include <stdio.h>
int main(vold)
{
long num:
long sum = OL:
_Bool input_is_good;
printf(“Please enter an integer to be summed”);
printf("(q to quit): “);
input_is_good = (scanf(”%ld", &num) ==1 );
while (input_is_good)
{
sum= sum + num;
printf(“Please enter next integer (q to qut): “)
input_is_good = (scanf(”%ld”, &num) == 1);
}
printf("Those integers sum to %ld.\n”,sum);
return 0;
}
注意程序中把比较的结果赋值给_Bool 类型的变量input_is_good:
input_is_good = (scanf("%ld", &num) == 1);
这样做没问题,因为==运算符返回的值不是1就是0。顺带一提,从优先级方面考虑的话,并不需要用圆括号把scanf(“%ld", &num) == 1括起来。但是,这样做可以提高代码可读性。还要注意,如何为变量命名才能让while循环的测试简单易懂:
while (input_is_good)
C99提供了stdbool.h头文件,该头文件让bool成为_Bool的别名,而且还把true和false 分别定义为1和0的符号常量。包含该头文件后,写出的代码可以与C++兼容,因为C++把bool、true和false定义为关键字。
如果系统不支持_Bool 类型,导致无法运行该程序,可以把_Bool替换成int即可。
3.优先级和关系运算符
关系运算符的优先级比算术运算符(包括+和-)低,比赋值运算符高。这意味着x > y+2 和 x >(y+2)相同,x = y > 2和x = (y> 2)相同。换言之,如果y大于2,则给x赋值1,否则赋值0。y的值不会赋给x。
关系运算符比赋值运算符的优先级高,因此,x_bigger = x > y;相当于x_bigger = (x>y);。
关系运算符之间有两种不同的优先级。
高优先级组: <<= >>=
低优先级组: == !=
与其他大多数运算符一样,关系运算符的结合律也是从左往右。因此:
ex != wye == zee 与 (ex != wye) == zee 相同
表1.4 运算符优先级
运算符(优先级从高到低) | 结合律 |
---|---|
() | 从左往右 |
- + ++ - - sizeof | 从右到左 |
* / % | 从左到右 |
+ - | 从左到右 |
< > <= >= | 从左到右 |
== != | 从左到右 |
= | 从右到左 |
小结: while语句
关键字: while
一般注解:
while语句创建了一个循环,重复执行直到测试表达式为假或0。while语句是一种入口条件循环,也就是说,在执行多次循环之前已决定是否执行循环。因此,循环有可能不被执行。循环体可以是简单语句,也可以是复合语句。
形式:
while ( expression )
statement
在expression部分为假或0之前,重复执行statement部分。
示例:
while (n++ < 100)
printf(" %d %d\n",n, 2*n + 1; //简单语句
while (fargo < 1000)
{// 复合语句
fargo = fargo + step;
step = 2 * step;
}
小结:关系运算符和表达式
关系运算符:
每个关系运算符都把它左侧的值和右侧的值进行比较。
< 小于
<= 小于或等于
= 等于
>= 大于或等于
!= 不等于
关系表达式:
简单的关系表达式由关系运算符及其运算对象组成。如果关系为真,关系表达式的值为 1 ;如果关系为假,关系表达式的值为0。
示例:
5> 2为真,关系表达式的值为1
( 2 + a ) == a 为假,关系表达式的值为0