例如,若有i=3:i+:,则i=3,i=4。可见,此处的=i++相当于i=(i=i)+1。再如,若有i=3;printf("%dn"i++),则程序运行结果为3。(4)后自增和后自减的优先级高于前自增和前自减。具体的优先级和结合性可以查看本书的附录C。5.2.2复合赋值运算符将算术运算符或位运算符置于赋值运算符之前构成的运算符,称为复合赋值运算符。在C语言中共有10种复合赋值运算符,包括+=、一一、*=、/=、%=等。复合赋值运算符的一般使用形式(以*=为例):变量*=表达式其功能等价于变量=变量*(表达式)例如:a+=3等价于a=a+3。x*=y+8等价于x=x*(y+8)。可见,使用复合赋值运算符能提高程序的简洁性,但降低了程序的可读性。初学者在编写程序时,应当首先保证程序的正确性和可读性。5.3for循环用for语句构成的循环称为for循环。5.3.1for语句for语句的一般形式:for(表达式1:表达式2:表达式3)单条语句其中,单条语句就是要反复执行的部分,称为循环体。需要注意,执行表达式1三个表达式之间是以分号隔开的,而不是逗号。土for语句的执行流程如图5.2所示,即首先执行表达式1,然后表达式2判断表达式2的值是真(非0)还是假(0),若为真(非0),则执非行一次循环体,并执行表达式3,然后自动返回;若表达式2的值第循环体为假(0),则结束循环,转而执行循环体之后的语句。5章执行表达式3可见,在for循环中,表达式1一般用于为循环变量赋初值,1表达式2则是循环的条件,表达式3一般用于递变循环变量的值?循循环的条件通常为关系表达式或逻辑表达式,也可以是任意的结果环图5.2for语句的执行类型为整型、实型、字符型、枚举型和指针型的表达式。结流程【例5.7】for循环示例构#include <stdio.h>程序int main(void)设(int i;计for(i=l;i<=5;i++)59
printf("d,",i);return 0;程序运行结果:1,2,3,4,5,从for循环的功能可以看出,for循环可以看作由while循环变形而来。也就是将给循环变量赋初值的语句和递变循环变量值的语句合并到for语句的括号之中。因而,for循环比while循环更简洁,但不如while循环直观。那么,什么时候使用for循环,什么时候使用while循环呢?一般而言,如果“循环变量赋初值、循环条件、循环变量递变”这三部分不太复杂,可以使用for循环;反之,则应当使用while循环。5.3.2for循环程序举例【例5.8】编写程序求n!。编程思路:该程序仍可采用累积运算的方法求解。只是要注意存放累乘结果的变量的初值应为1。源程序:#include <stdio.h>intmain(void)出版flong f/*不能用n!作为变量名*int i,n;scanf("&d",&n);f=1;for(i=l;i<=n;i++f=f*i;printf("f=ldin",f);return 0;在选择变量类型时,要考虑到结果的取值范围。例如,在本例中当n的值较大时,n的阶乘值就会很大,则应将f定义为float型或double型。【例5.9】编写程序求出所有的水仙花数。水仙花数是一个3位正整数,其各位数字的立方之和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。编程思路(判断某一个数是否是水仙花数):首先只考虑一个正整数,要判断它是不是水仙花数,只需分离出它的各位数字并判断是否符合水仙花数的条件即可。(1)定义变量x存放一个三位正整数,定义变量a、b、c分别存放x的百、十、个位c语数字。言(2)从键盘输人一个三位正整数,存入变量x中。程(3)从变量x中分离出百、十、个位数,并分别存入变量a、b、c中。序(4)若a、b、c的立方之和等于x,则x是水仙花数,输出变量x的值。设相应的源程序:计新#include<stdio.h>思int main(void)路(int x,a,b,ci60
scanf("%d",&x);/*分离出x的百位数*/a=x/100;/*分离出x的十位数*/b=x%100/10;C=x810;/*分离出×的个位数*/if(a*a*a+b*b*b+c*c*c==x)/*若用pow函数,则有可能产生误差*printf("%d是水仙花数\n",x);elseprintf("%d不是水仙花数\n",x);return 0;若要求出所有的水仙花数,只需令变量x依次取值100~999,并循环执行分离及判断一个正整数的语句组即可。也就是将输入x值的语句,替换为一条for语句的语句头,并将分离及判断部分作为循环体。最终的源程序:#include <stdio.h>Kint main(void)int x,a,b,c;for(x=100;x<=999;x++)ta=x/100;/*分离出×的百位数*//*分离出×的十位数*b=x%100/10;/*分离出×的个位数*/C=x%10;/*若用pow函数,则有可能产生误差*if(a*a*a+b*b*b+c*c*c==x)printf("gd是水仙花数ln",x):return O;5.3.3关于循环结构的几点说明(1)在循环体中,必须要有能够改变循环变量的值并使循环趋向于结束的语句或表达式例如,若将例5.4中while循环部分改写为while(i<=100);(sum-sum+i;第i=i+1;5章则该循环将变成无限循环(死循环),因为此时的循环体是空语句(分号),从而导致循环条件始终为真。循(2)循环体只能是语法意义上的单条语句。若需要多条语句,则必须用花括号括起来环以构成一条复合语句。结构例如,若将例5.4中while循环部分改写为程while(i<=100)序sum=sum+i;设i=i+l;计则该循环仍为死循环,因为此时的循环体是sum=sum+i;这一条语句,从而导致循环条件始61
终为真。(3)循环体中语句的先后顺序对程序的运行结果会产生影响。例如,若将例5.4中的while循环部分改写为while(i<=100)(i=i+l;sum=sum+i;则程序运行结果:sum=5150其原因是少加了第一项1,而多加了一项101(4)如果同一个程序中的两个循环互不包含于对方的循环体中,则称为相互平行的循环当两个平行的循环执行时,只有当第一个循环全部完成之后,才会开始第二个循环的执行例如:#include<stdio.h>版社int main(void)(int i;for(i-l;i<=5;i++)printf("gd,",i*i);for(i=l;i<=6;i++)printf("gd,",i*i*i):return 0;程序运行结果:1,4,9.16.25,1,8,27,64,125.216可以发现,相互平行循环的循环变量允许同名。5.4do-while循环用do-while语句构成的循环,称为do-while循环。5.4.1do-while语句do-while语句的一般形式为Tdo循环体单条语句cwhile(表达式):文语do-while语句的执行流程如图5.3所示,即首先执行一次循环体表达式言然后判断表达式的值是真(非0)还是假(0),若表达式的值为真程(非0),则返回到循环体的开始部分,继续执行一次循环体:若表非0序达式的值为假(0),则结束循环,转而执行循环体之后的语句。设→两点说明:计新(1)在while(表达式)之后要有一个分号,因为到此已经构成图5.3do-while语句思一条完整的语句;的执行流程路(2)do-while循环的循环体最少要执行一次。62