C控制语句: 循环
C语言有3种循环: for、 while、 do while
#include <stdio.h>
int main(void)
{
long num;
long sum = 0L; /* 把sum初始化为0 */
int status;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
status = scanf("%ld", &num);
while (status == 1)
{
sum = sum + num;
printf("Please enter next integer (q to quit): ");
status = scanf("%ld", &num);
}
printf("Those integers sum to %ld.\n", sum);
return 0;
}
该程序使用long类型以储存更大的整数。 尽管C编译器会把0自动转换为合适的类型, 但是为了保持程序的一致性, 我们把sum初始化为0L(long类型的0) , 而不是0(int类型的0) 。
因为while循环是入口条件循环, 程序在进入循环体之前必须获取输入的数据并检查status的值, 所以在 while 前面要有一个 scanf()。 要让循环继续执行, 在循环内需要一个读取数据的语句, 这样程序才能获取下一个status的值, 所以在while循环末尾还要有一个scanf(), 它为下一次迭代做好了准备。
C更为简洁, 下面的代码:
status = scanf("%ld", &num);
while (status == 1)
{ /*
循环行为 */
status = scanf("%ld", &num);
}
可以用这些代码替换:
while (scanf("%ld", &num) == 1)
{ /*
循环行为*/
}
index = 10;
while (index++ < 5)
printf("Have a fair day or better.\n");
程序清单6.4 while2.c程序
/* while2.c -- 注意分号的位置 */
#include <stdio.h>
int main(void)
{
int n = 0;
while (n++ < 3); /* 第7行 */
printf("n is %d\n", n); /* 第8行 */
printf("That's all this program does.\n");
return 0;
}
可以这样写:
while (scanf("%d", &num) == 1)
; /* 跳过整数输入 */
这样做一方面让读者更容易看到空语句, 一方面也提醒自己和读者空语句是有意而为之。 处理这种情况更好的方法是使用continue语句。
下面有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头文件中)可以方便地比较浮点数, 该函数返回一个浮点值的绝对值(即, 没有代数符号的值) 。
程序清单6.5 cmpflt.c程序
// cmpflt.c -- 浮点数比较
#include <math.h>
#include <stdio.h>
int main(void)
{
const double ANSWER = 3.14159;