【C primer plus】C控制语句:循环
6.1 再探while循环
1 //summing.c --根据用户键入的整数求和 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <stdio.h> 4 int main(void) 5 { 6 long num; 7 long sum = 0L; //把sum初始化为0 8 int status; 9 10 printf("Please enter an integer to be summed"); 11 printf("(q to quit):"); 12 status = scanf("%ld", &num); 13 while (status == 1) { 14 sum = sum + num; 15 printf("Please enter next integer (q to quit):"); 16 status = scanf("%ld", &num); 17 } 18 printf("Those integers sum to %ld.\n", sum); 19 20 return 0; 21 }

6.1.1 程序注释
==运算符是C的相等运算符。
如果scanf()转换值之前出了问题(例如,检测到文件结尾或遇到硬件问题),会返回一个特殊值EOF(其值通常被定义为-1),这个值也会引起循环停止。
程序的结构如下:
把sum初始化为0提示用户输入数据读取用户输入的数据当输入的数据为整数时,输入添加给sum,提示用户进行输入然后读取下一个输入输入完成后,打印sum的值
这叫做伪代码,是一种用简单的句子表示程序思路的方法。
while循环的标准格式(伪代码)
获得第一个用于测试的值当测试为真时处理值获取下一个值
6.1.2 C风格读取循环
C的语法特性让你可以用下面的精简版本替换标准版本
当获取值和判断值都成功处理该值
6.2 while语句
while循环的通用形式如下:
while(expression) statement;
statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
每次循环都被称为一次迭代。

6.2.1 终止while循环
while循环有一点非常重要:在构建while循环时,必须让测试表达式的值有变化,表达式最终要为假。否则循环就不会终止。
6.2.2 何时终止循环
只有在对测试条件求值时,才决定是终止还是继续循环
6.2.3 while:入口条件循环
while循环是使用入口条件的有条件循环。所谓“有条件”指的是语句部分的执行取决于测试表达式的描述条件。测试表达式是一个入口条件,因为必须满足条件才能进入循环体。
6.2.4语法要点
只有在测试条件后面的单独语句(简单语句或复合语句)才是循环部分。
即使while语句本身使用复合语句,在语句结构上,它也是一条单独的语句。该语句从while开始执行,到第一个分号结束。在使用了复合语句的情况下,到右花括号结束。
单独的分号表示空语句,有时程序员会故意使用带空语句的while语句,因为所有任务都在测试条件中完成了。不需要在循环体中做什么。
6.3 用关系运算符和表达式比较大小
while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式,出现在关系表达式中间的运算符叫做关系运算符。

关系运算符常用于构造while语句和其他C语句中用到的关系表达式。这些语句都会检查关系表达式为真还是为假。
虽然关系运算符也可用来比较浮点数,但是要注意:比较浮点数时候,尽量只使用<和>。因为浮点数的误差会导致在逻辑上应该相等的两数却不相等。使用fabs()函数可以方便的比较浮点数。该函数返回一个浮点值的绝对值(即,没有代数符号的值)
6.3.1 什么是真
表达式为真的值是1,表达式为假的值是0
6.3.2 其他真值
一般而言,所有的非零值都视为真,只有0被视为假。
也可以说,只要测试条件的值为非零,就会执行while循环,这是从数值方面而不是从真/假方面来看测试条件。
6.3.4 新的_Bool类型
在编程中,表示真或假的变量被称为布尔变量,所以_Bool是C语言中布尔变量的类型名。_Bool类型的变量只能储存1或0,如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1,这反映了C把所有的非零值都视为真。
C99提供了stdbool.h头文件,让bool称为_Bool的别名,而且还把true和false分别定义为1和0的符号常量,包含该头文件后,写出的代码可以与C++兼容。
6.3.5 优先级和关系运算符
关系运算符的优先级比算术运算符低,比赋值运算符高。
关系运算符之间有两种不同的优先级:
高优先级组:< <= > >=
低优先级组:== !=
与其他大多数运算符一样,关系运算符的结合律也是从左往右。
6.4 不确定循环和计数循环
不确定循环是指在测试表达式为假之前,预先不知道要执行多少次循环。还有一类是计数循环,这类循环在执行循环之前就知道要重复执行多少次。
在创建一个重复执行固定次数的循环中涉及了三个行为:
1.必须初始化计数器
2.计数器与有限的值作比较
3.每次循环时递增计数器
6.5 for循环
for循环把上述3个行为(初始化、测试和更新)组合在一处。
关键字for后面的圆括号中有3个表达式,分别用两个分号隔开。第一个表达式是初始化,只会在for循环开始时执行一次。第二个表达式是测试条件,在执行循环之前对表达式求值。如果表达式为假,循环结束。第三个表达式执行更新,在每次循环结束时求值。
完整的for语句还包括后面的简单语句或复合语句。for圆括号中的表达式也叫做控制表达式,它们都是完整表达式。所以每个表达式的副作用都发生在下一个表达式求值之前。

6.5.1 利用for的灵活性
for的9种用法:
可以使用递减运算符来递减计数器。
可以让计数器递增2、10等
可以用字符代替数字计数
除了测试迭代次数外,还可以测试其他条件。
可以让递增的量几何增长,也就是说,每次都乘上而不是加上一个固定的量
第三个表达式可以使用任意合法的表达式。无论是什么表达式,每次迭代都会更新该表达式的值。
可以省略一个或多个表达式(但是不能省略分号),只要在循环中包含能输循环的语句即可。
第一个表达式不一定是给变量赋初值,也可以使用printf()。记住,在执行循环的其他部分之前,只对第一个表达式求值一次或执行一次。
循环体中的行为可以改变循环头中的表达式。
6.6 其他赋值运算符:+=、-=、*=、/=、%=
C有许多赋值运算符。最基本、最常用的是=,它把右侧表达式的值赋给左侧的变量。其他赋值运算符都用于更新变量,其用法都是左侧是一个变量名,右侧是一个表达式,赋给变量的新值是根据右侧表达式的值调整后的值。确切的调整方案取决于具体的运算符。

以上提到的运算符与=的优先级相同。
6.7 逗号运算符
逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。
逗号运算符有两个性质,首先,它保证了被它分割的表达式从左往右求值(换言之,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生)。
其次,整个逗号表达式的值是右侧项的值。
逗号也可用作分隔符。
6.8 出口条件循环:do…while
while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这保证了至少执行循环体中的内容一次。
下面是do while循环的通用格式:
do statement; while(expression);
statement可以是一条简单语句或复合语句。
do…while循环在执行完循环体后才执行测试条件,所以至少执行循环体一次;而for循环或while循环都是在执行循环体之前先执行测试条件。do…while循环适用于那些至少要迭代一次的循环。例如
do{提示用户输入密码读取用户输入的密码} while (用户输入的密码不等于密码)
6.9 如何选择循环
首先,确定是需要入口条件循环还是出口条件循环。
通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。
一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于涉及索引计数的循环,用for循环更合适。
6.10 嵌套循环
嵌套循环指在一个循环内包含另一个循环。嵌套循环常用于按行和列显示数据,也就是说,一个循环处理一行中的所有列,另一个循环处理所有的行。
6.11 数组简介
数组是按顺序储存的一些列类型相同的值,整个数组有一个数组名,通过整数下标访问数组中单独的项或元素。例如
1 float debts[20];
声明debts是一个包含20个元素的数组,每个元素都可以储存float类型的值。数组的第一个元素使debts[0],第二个是debts[1],以此类推,直到debts[19]。注意,数组元素的编号从0开始,不是从1开始。
可以给每个元素赋float类型的值。
使用数组元素和使用同类型的变量一样。
要注意,考虑到影响执行的速度,C编辑器不会检查数组的下标是否正确。当运行程序时,这会导致数据被放置在已被其他数据占用的地方,可能会破坏程序的结果甚至导致程序异常中断。
数组的类型可以是任意数据类型。
可以把字符串储存在char类型的数组中。如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串。
用于识别数组元素的数字被称为下标、索引或偏移量,下标必须是整数而且要从0开始计数。数组的元素被依次储存在内存中相邻的位置。

浙公网安备 33010602011771号