在本章中您将学习的内容:
* 关键字:
for
while
do while
*运算符:
< > >=
<= != == +=
*= -= /= %=
*函数:
fabs( )
* c的三种循环结构:while、for和do while。
* 使用关系运算符构建控制循环的表达式。
* 其他一些运算符。
* 循环中常用的数组。
* 编写具有返回值的函数。
6.1.2C 风格的读循环
status = scanf("%d", &num);
while(status == 1)
{
/* loop actions */ //循环动作
status = scanf("%d", &num);
}
可以用下列形式代替:
while(scanf("%d", &num) == 1)
{
/* loop actions */ //循环动作
}
第二种形式同时使用了scanf( )的两种不同用法。首先,如果调用成功,函数会把一个值放在 num中;第二
函数的返回值(1或0,而不是num的值)用来控制循环。
6.2 while 语句
while 循环的一般形式
while(expression) //表达式
statement //语句
6.2.1 终止while 语句
这是对while循环至关重要的一点:当您构造一个while 循环时,循环中必须包含能改变判断表达式的值来使表
达式的值最终变为假。
6.2.2 循环何时终止
要知道只有在计算判断的值时才决定是终止循环还是继续执行,这一点很重要。
6.2.3 while: 入口条件循环
while 循环是使用入口条件的有条件循环。它被称为有条件是因为语句部分的执行要依赖于判断表达式中的条件。
例如(index < 5).这个表达式是一个入中条件是因为在进入循环体之前必须满足这个条件。
6.2.4 语法要点。
在使用 while 时要谨记的一点是: 只有位于判断条件之后的单个语句(简单语句或复合语句) 才是循环的部分。缩进是为了帮助读者而不是计算机。
1. /* while1.c -- 注意花括号的使用 */
/* 拙劣的代码产生了一个无限循环 */
#include<stdio.h>
int main(void)
{
int n = 0;
while( n < 3 )
printf("n is %d", n);
n++;
// 缩进了n++, 但并没有把它和前面的语句放在一个花括号中。
printf("That's all this program does\n");
return 0;
}
产生下列输出:
n is 0
n is 0
n is 0
(......等等,直到强行关闭这个程序为止)
2. /*while2.c -- 注意分号的使用 */
#include<stdio.h>
程序产生下列输出:
n is 4
That's all this program does.
假定您想要路过输入直到第一个不为空格的数字的字符, 您可以使用这样的循环:
while(scanf("%d", &num) == 1)
; /* 跳过整数输入 */
只要scanf( )读入一个整数,它就返回1,循环就会继续。
6.3 比较大小: 使用关系运算符和表达式。
关系运算符
运算符 | 含义 |
< | 小于 |
<= | 小于或等于 |
== | 等于 |
>= | 大于或等于 |
> | 大于 |
!= | 不等于 |
关系运算符用来构成在while语句和其他C语句中使用的关系表达式。
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;
关系表达式也可用于字符的比较,进行比较是使用的是机器 的字符代码(假定为ASCII)。但不能用关系运算符来比较字符串。
关系运算符也可以用于浮点数。但要小心,在浮点数比较中只能使用 < 和 >。 原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。例如3 和 1/3 的乘积应该是1.0。 但是如果您用6位小数来表示1/3,乘积就是 .999999而不是1。使用math.h头文件中声明的fabs( ) 函数可能方便地时行浮点判断。这个函数返回一个浮点值的绝对值(即没有代数符号的值)。
6.3.1 什么是真
对于C 来说,一个真表达式的值为1, 而一个假表达式的值为0。
6.3.2 还有什么是真
所有的非零值都被认为是真,只有0被认为是假。
6.33 真值的问题
6.34 新的_bool类型
在C语言中,表示真/假的变量一直是由int类型来表示的。c99专门为这种类型的变量添加了_Bool类型。一个_Bool变量只可以具有值1(真)或0(假)。如果您把一个_Bool变量赋为一个非零的数值。变量就被设置为1。这说明C把任何非零的值都认为是真。
#include<stdio.h>
int main(void)
{
long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter a 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 quit): ");
input_is_good = (scanf("%ld", &num) == 1);
}
printf("Thost integers sum to %ld.\n", sum);
return 0;
}
c99还提供了一个stdbool.h头文件。包含这个头文件可以使用bool来代替_Bool, 并把true 和 false定义为1和0的符号常量。在程序中包含这个头文件可以写出与c++兼容的代码,因为c++把bool,true和false定义为关键字。
6.3.5 关系运算符的优先级
运算符(优先级从高到低) | 结合性 |
() | 从左到右 |
- + ++ -- sizeof(type)(所有一元运算符) | 从右到左 |
* / % | 从左到右 |
+ - | 从左到右 |
< > <= >= | 从左到右 |
== != | 从左到右 |
= | 从右到左 |
6.4 不确定循环与计数循环
在建立一个重复执行固定次数的循环时涉及到三个动作:
必须初始化一个计数器。
计数器与某个有限的值进行比较。
每次执行循环,计数器的值都要递增。
程序清单 6.10 sweetie1.c
#include<stdio.h>
int main(void)
{
const int NUMBER = 22;
int count = 1; //初始化
while(count <= NUMBER) //判断
{
printf("Be my Valentine!\n"); //动作
count++; //更新计数器
}
return 0;
}
while 循环条件执行比较的动作,增量运算符执行递增的动作。例6.10中,递增在循环结尾处执行。这使得有可能不小心漏掉递增的动作。所以更好的方法是使用count++ <= NUMBER 来把判断与更新动作结合在一个表达式中,但使用这种方法时计数器的初始化是在循环之外进行的,这样就有可能忘记初始化。for循环是一种可以避免这些问题的控制语句。
6.5 for 循环
for循环把所有这三种动作(初始化、测试、更新)都放在一起。
程序清单 6.11 sweetie2.c
#include<stdio.h>
int main(void)
{
const int NUMBER = 22;
int count;
for(count = 1; count <= NUMBER; count++)
printf("Be my Valentine!\n");
return 0;
}
利用for的灵活性,for循环的9种可能性
您可以使用减量运算符减少计数器而不是增加它
#include<stdio.h>
int main(void)
{
int secs;
for(secs = 5; secs > 0; secs--)
printf("%d seconds!\n", secs);
printf("We have ignition!\n");
return 0;
return 0;
}
运行结果:
5 seconds!
4 seconds!
3 seconds!
2 seconds!
1 seconds!
2. 如果需要,您可以让计数器依次加2,加10,等等:
#include<stdio.h>
int amin(void)
{
int n; /* 以13计数 */
for(n = 2; n < 60; n = n + 13)
printf("%d \n", n);
return 0;
}
运行结果:
2
15
28
41
54
3.您也可以用字符代替数字来进行计数:
#include<stdio.h>
int main(void)
{
char ch;
for (ch = 'a'; ch <= 'z'; ch++)
printf("The ASCII value for %c is %d.\n", ch, ch);
return 0;
}
部分输出:
The ASCII value for a is 97.
The ASCII value for a is 98.
The ASCII value for a is 99.
......
4.您可以判断迭代次数之外的条件
for(num = 1; num*num*num <= 216; num++)
5.您也可以让数量几何增加而不是算术增加。
#include<stdio.h>
int main(void)
{
double debt;
for (debt = 100.0; debt < 150.0; debt = debt * 1.1)
printf("Your debt is now $%.2f.\n", debt);
return 0;
}
运行结果:
Your debt is now $100.00.
Your debt is now $110.00.
Your debt is now $121.00.
Your debt is now $133.10.
Your debt is now $146.41.
6.在第三个表达式中,您可以使用所需的任何合法表达式。
#include<stdio.h>
int main(void)
{
int x;
int y = 50;
for(x = 1; y = 75; y = (++x * 5) + 50)
printf("%10d %10d\n", x, y);
return 0;
}
运行结果:
1 55
2 60
3 65
4 70
5 75