1
C语言程序设计
1.4.5 3.5 for循环语句

3.5 for循环语句

在实际问题中常需要重复进行某些运算或操作,这类问题用循环控制结构来解决,例如统计学生成绩、迭代求根、若干数求和等。因此几乎任何实用程序都包含了循环结构。C提供的for语句是使用最广泛、最灵活的一种循环控制语句。

for语句的一般形式为

  for(表达式1;表达式2;表达式3) 语句;

其中,表达式1——一般为赋值表达式,为循环控制变量赋初值;

  表达式2——一般为关系表达式或逻辑表达式,作为控制循环结束的条件;

  表达式3——一般为赋值表达式,为循环控制变量增量或减量。

for中的语句为循环体,可以是单语句,也可以是复合语句。

for控制语句的执行过程:流程控制图如图3.5.1所示

img249

图3.5.1 for循环结构流程

(1)首先计算表达式1,为循环控制变量赋初值。

(2)计算表达式2,检查循环控制条件,若表达式2的值为真,执行一次循环体;若为假,转出循环结构。

(3)执行完一次循环体后,计算表达式3,对控制变量进行增量或减量操作,再重复第(2)步操作。

例如:计算1+2+3+…+100。

  int i,sum;

  sum=0;

  for(i=1;i〈=100;i++) sum=sum+i;

上述语句给循环控制变量i赋初值1,当i〈=100时,将i的值累加到求和变量sum中,每完成一次累加运算,i的值增1,直到i的值大于100时,循环累加才结束。

使用for语句时应注意下面几点,以便更灵活地使用语句。

1.for语句的任何一个表达式都可省略,但不能省略分号“;”,省略表达式后,使for语句有几种变化形式,增强了它的灵活性和实用性。

(1)省略表达式1

若循环控制变量的初始值不是预先已知的常量,而是通过前面程序的某种操作或计算得到,则可省略表达式1。例如:

img250

(2)省略表达式3

当循环体内含有修改循环控制变量的语句,并能保证循环正常结束时,可省略表达式3,例如:

  for(i=0;i!=234;)

  scanf("%d",&i);

此循环结构读入若干整型数,直到读入的数字为234时结束循环。

(3)省略所有表达式

当for语句中没有表达式2时,编译程序将解释为表达式2的值为1,循环判定条件为真。循环将无限进行下去,称为死循环。

  for(; ;)

  {循环体;}

实用程序不应出现死循环。循环体内应有某些语句能使循环达到终止条件,正常退出循环。例如:

img251

当程序循环到读入一个字符'*'时,执行break语句退出循环,break语句在循环结构中的应用将在后面进一步介绍。

2.for语句中可应用逗号表达式,使两个或多个控制变量同时控制循环。例如:(设value在前面的程序中已赋为某一正整型值)

img252

表达式1和表达式3均为逗号表达式。表达式1同时为i,j赋初值,表达式3对i增1,对j减1,当i大于等于j时,循环结束。

for语句还可用来实现程序的延时功能,例如:

img253

或写成:

  for(i=1,j=1;i〈10000;i++,j*=1) ;

将表达式3也写为逗号表达式,循环体成为空语句。“;”代表空语句,表示不执行任何操作,但在语法上是不可少的,否则C编译程序将判定为缺少循环体,这条for语句通过进行10 000次加法、乘法和比较操作,实现延时等待功能。

3.C语言的for语句允许在循环体内改变循环控制变量的值。

例如:输入若干数并求和,直到和值大于等于3000或输入数字个数等于100时为止。

img254

img255

若输入数据为:

  23 45 67 2900 34 67

当程序读入2900后,sum的值大于3000,循环控制变量count的值被循环体的语句赋值为100,达到循环终止条件,循环结束。

例3-7 打印九九乘法表。

img256

程序第一个for语句打印表的第一行,后两个for语句构成了一个二重循环结构,计算并打印九九表的内容,其中第13行打印表的第一列。注意内层循环的控制表达式写法,它考虑了九九表的规律。

程序的执行结果是:

  * 1 2 3 4 5 6 7 8 9

  1 1

  2 2 4

  3 3 6 9

  4 4 8 12 16

  5 5 10 15 20 25

  6 6 12 18 24 30 36

  7 7 14 21 28 35 42 49

  8 8 16 24 32 40 48 56 64

  9 9 18 27 36 45 54 63 72 81

例3-8 编写程序显示输入的整数的二进制位组合。

程序如下:

img257

程序的执行结果是:

img258

该程序读入一个整数number,首先用位逻辑运算number&0×8000得到它的最高位,把这一位放到变量temp中,然后对temp进行右移15位的操作,即把最高位移到temp的最低位上,显示完这一位后,把这一位从number中移出去。这个过程一直进行下去,直到number的各位都显示完毕。

常见的编程错误3.2

img259 在for循环中,循环执行的次数比期望值多一次或少一次,应特别注意用于控制循环变量的初值和条件制定式的终止值。

img260 将一个分号放在for 语句的末尾,将产生一个什么都不做的空循环。

img261 误用逗号而不是分号分开for语句中的各项表达式。