6.1 再探while循环
<details>
<summary>点击查看代码</summary>
`/* summing.c -- sums integers entered interactively */
#include <stdio.h>
int main(void)
{
long num;
long sum = 0L; /* initialize sum to zero */
int status;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
status = scanf("%ld", &num);
while (status == 1) /* == means "is equal to" */
{
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;
}`
</details>
该程序关键一点:status = scanf("%ld", &num);
若用户输入的不是数字,scanf()会读取失败并返回0,若在转换值之前遇到了问题(如检测到文件结尾或硬件问题),则返回-1。
——scanf的双重特性。
6.2 真值的问题
误用=会导致无限循环。
_Bool类型:只能储存1和0。若把非零值赋给_Bool类型的变量,该变量会被设置为1。
C99提供了stdbool.h头文件,让bool成为_Bool的别名。
6.3 for循环
for循环的初始化只会在for循环开始时执行1次。
6.4 逗号运算符
逗号是一个序列点(逗号左侧项的所有副作用都在逗号右侧项之前完成)。
逗号表达式的值是右侧项的值。
6.5 如何选择循环:
入口条件循环(do-while):在执行循环前测试比较好、在许多应用中要求在一开始不满足测试条件时就直接跳过整个循环。
for循环:涉及初始化和更新变量、涉及索引计数的循环。
其他情况:while循环。
6.6 关键概念
函数原型是为了方便编译器查看程序中使用的函数是否正确。现代的编程习惯是把程序要素分为接口部分和实现部分,例如函数原型和函数定义。接口部分描述了如何使用一个特性,也就是函数原型所做的;实现部分描述了具体的行为,这是函数定义所做的。