第六章 C控制语句:循环
6.1 前导程序
- #include <stdio.h> //对输入的整数求和
- int main(void)
- {
- long num;
- long sum=0l; //保持一致性
- int status;
- status=scanf("%ld",&num);
- while(status==1)
- {
- sum+=num;
- status=scanf("%ld",&num);
- }
- printf("Those integers sum to%ld.\n",sum);
- return 0;
- }
6.1.1 程序注解
循环的判断条件:status==1 ==:相等运算符。
scanf()返回成功读入的项目的个数。如果未读入整数,则返回0;
伪代码是一种用简单的英语来表示程序的方法,它与计算机语言的形式相对应。
循环的标准格式:
get first value to be tested
while the test is successful
process value
get next value
6.1.2 C风格的读循环
status=scanf("%ld",&num);while(status==1)可以用while(scanf("%ld",&num)==1)来代替。
C的语法特性可以允许你使用精简版本
while getting and testing the value succeeds
process the value
6.2 while语句
while循环的一般形式:
while(expression)
statement
statement可以是一个带有分号的简单语句,也可以使花括号中的一个复合语句。
6.2.1 终止while循环
while循环是使用入口条件的有条件循环。语句部分的执行要依赖于判断表达式中的条件。
当您构造一个while循环时,循环中必须包含能改变判断表达式的值来使表达式的值最终变为假。
只有在计算判断条件的值时才决定是终止循环还是继续执行。
假定你想要跳过输入直到第一个不为空格或数字的字符,可以使用这样的循环:
while (scanf("%d",&sum)==1)
;
将空语句放在下一行,可以提醒用户是有意放在那的。
6.3 比较大小
关系运算符:<,<=,==,>=,>,!=。
在浮点数比较中只能使用<和>。原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。
使用在math.h头文件中声明的fabs()函数可以方便地进行浮点数判断,她返回一个浮点数的绝对值。
6.3.1 真值的问题
对C来说,一个真表达式的值为1,而一个假表达式的值为0。
更一般地,所有的非零值都被认为是真,只有0被认为是假。
例如while(goats!=)可以用while(goats)代替。
如果进行比较的双方中有一个是常量,则可以把它放在比较表达式的左边,这样有助于发现错误。
例如5==canoes;
C99中添加了_Bool类型,一个Bool变量只可以具有值1或0。
6.3.2 关系运算符的优先级
关系运算符的优先级低于算术运算符但高于赋值运算符。
关系运算符本身也分为两组不同的优先级:
高优先的组:< <= > >=
低优先的组:== !=
关系运算符从左到右结合。
6.4 for循环
for循环把三种动作(初始化、测试、更新)都放在一起。
第一个表达式进行初始化,它在for循环开始的时候执行一次。它不必初始化一个变量,也可以是某种类型的printf()语句。
第二个表达式是判断条件,在每次执行循环之前都要对它就行求值。
第三个表达式进行改变,在每次循环结束时进行计算。
x*=3*y+12 等于 x=x*(3*y+12)
6.5 逗号运算符
首先,它保证被它分开的表达式按从左到右的次序进行计算。
作为顺序点的逗号保证左边字表达的副作用在计算右边的子表达式之前生效。
再次,逗号也可以用作分隔符,例如声明语句中。
6.6 do while循环
它的一般形式:
do
statement
while(expression);
do while循环本身是一个语句,因此它需要一个结束的分号。
该循环至少要被执行一次。而for或者while循环可以一次都不执行。
在循环涉及到初始化和更新变量时使用for循环较为适当,而在其它条件下使用while循环更好一些。
6.7 数组
一个数组就是线性存储的一系列相同类型的值。
出于执行速度的考虑,C并不检查您是否使用了正确的下标。
如果字符数组包含了空字符\0,那么字符数组的内容就构成了一个字符串。
用于标识数组元素的数字称为下标、索引、或偏移量。
数组中的元素在内存中是顺序存储的。
C99允许您使用常量值指定数组大小,但是C90不允许。你可以使用#define指令创建一个指定数组大小的明显常量,#define在C90C99情况下都可以使用。
Q1:假定value是一个int类型的值,以下的循环会产生什么输出?
for(value=36;value>0;value/=2)
printf("%3d",value);
A1:36 18 9 4 2 1
Q2:如果value是一个double类型的值而不是int类型的值,会有什么问题?
A2:那么value变得小于1时判断条件仍会保持为真。循环会一直执行,直到由于浮点数下溢而产生0值。另为%3d说明符也是不正确的。