C控制语句:循环
本文主要学习以下内容:
- 关键字:for 、while 、do while
- 运算符:< 、> 、>= 、<= 、== 、+= 、*= 、-= 、/= 、%=
- 函数:fabs()
- C语言有三种循环:for 、while 、do while
- 使用关系运算符构建控制循环的表达式
- 其他运算符
- 循环常用的数组
- 编写有返回值的函数
while循环
#include<stdio.h>
int main(void)
{
int n = 5;
while (n < 7)
{
printf("n = %d\n",n);
n++;
printf("Now n = %d\n",n);
}
printf("The loop has finished.\n");
return 0;
}
输出结果如下:
n = 5
Now n = 6
n = 6
Now n = 7
The loop has finished.
while循环的通用形式如下:
while (expression)
statement
statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
expression大多使用关键表达式,expression是值之间的比较,可以使用任何表达式。如果expression为真(或者更一般的说,非零),则执行statement部分一次,然后再次判断expression,只要expression判断不为假,则statement部分一直执行,每次循环都称为一次迭代。
- 何时中止while循环
要明确一点:只有在对测试条件求值时,才决定是中止还是继续循环。在上面的程序中,当运行到第二次循环时,n首次获得之7,但是此时程序并未退出,在打印出n此时的值后结束本次循环,然后进行下一次测试条件求值,然后才退出循环。 - while:入口条件循环
while循环是使用入口条件的有条件循环。所谓有条件指的是语句部分的执行取决于测试表达式描述的条件,如(index < 5)。该表达式就是一个入口条件,必须要满足这个入口条件才会进入循环体。 - 语法要点
要注意在while循环测试条件后的单独语句才是循环部分(简单语句或复合语句)
#include<stdio.h>
int main(void)
{
int n = 0;
while (n < 3)
printf("n is %d\n",n);
n++;
printf("That's all this program does\n");
return 0;
}
这是一个很糟糕的无限循环程序:
n is 0
n is 0
n is 0
n is 0
n is 0
n is 0
n is 0
...
虽然我们缩进了n++这条语句,但是我们没有把它和上一条语句括在花括号内。因此,只有跟在测试条件后面的第一条语句是循环的一部分,变量n的值始终没有改变。
我们在注意一下下面的这种情况:
while(scanf("%d",&num) == 1);
这个while循环在测试条件后面直接跟了个分号,表示循环部分为一个空语句。只要我们的输入是一个整数,scanf就会返回1,测试条件为真,循环部分为空语句,程序会直接读取下一个输入,直到我们输入的为一个非整数。
用关系运算符和表达式比较大小
while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式,出现在关系表达式中的运算符叫做关系运算符。
表:关系运算符:
运算符 | 含义 |
---|---|
< | 小于 |
> | 大于 |
>= | 大于或等于 |
<= | 小于或等于 |
!= | 不等于 |
要注意,不能用关系运算符来比较字符串。
- 真值
在C中,表达式一定有一个值,关系表达式也一样,对C而言,表达式为真的值是1,表达式为假的值是0;
while(1)
{
...
}
这种情况,程序会一直循环。一般而言,所有的非零值都视为真,只有0被视为假。
- 新的_Bool类型
C语言中,一直用int类型的变量表示真假,C99专门针对这种类型的变量新增了_Bool类型。
这种类型的变量只能存储1或0。如果把其他非零值赋给_Bool类型的变量,该变量会被设置为1。
//使用_Bool类型的变量
#include<stdio.h>
int main(void)
{
long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter an integer to be summed");
printf("(q to quit):");
input_is_good = (scanf("%ld",&num) == 1);
while (input_is_good)
{
sum = sum + num;
printf("Please enter next integer (q to quit):");
input_is_good = (scanf("%ld",&num) == 1);
}
printf("Those integers sum to %ld.\n",sum);
return 0;
}
在这个程序中:
input_is_good = (scanf("%ld",&num) == 1);
scanf根据我们的输入得到返回值,然后根据返回值判断是否等于1,是的话返回true,不是则返回false。
for循环
在创建一个重复执行固定次数的循环中涉及了3个行为:
1.必须初始化计数器;
2.计数器与有限的值做比较;
3.每次循环时递增计数器。
for循环中把上述3个行为(初始化、测试和更新)组合在一起:
// sweetie2.c -- 使用for循环的计数循环
#include<stdio.h>
int main()
{
const int NUMBER =22;
int count;
for (count =1 ;count <= NUMBER; count++)
{
printf("Be my Valentine!\n");
}
return 0;
}
关键字后面的圆括号中有三个表达式,分别用连个分号隔开。第一个表示式时初始化,只会在for循环开始时执行一次,第二个表达式是测试条件,在循环执行之前对表达式求值,如果表达式为假,循环结束,第三个表达式执行更新,在每次循环结束时求值。
注意,在上面的程序中最后得到的count值为23。
出口条件循环:do while
while循环和for循环都是入口条件循环,do while则是出口条件循环,即在循环的每次迭代之后检查测试条件,它能保证至少执行循环体中的内容一次。这种循环被称为do while循环。
/*do_while.c --出口条件循环*/
#include<stdio.h>
int main()
{
const int secret_code =13;
int code_entered;
do
{
printf("To enter the triskaidekaphobia therapy club,\n");
printf("Please enter the secret code number:");
scanf("%d",&code_entered);
} while (code_entered != secret_code);
printf("Congratulations! You are cured!\n");
return 0;
}
注意do while循环以分号结尾,至少要执行循环一次才会执行测试条件。
To enter the triskaidekaphobia therapy club,
Please enter the secret code number:12
To enter the triskaidekaphobia therapy club,
Please enter the secret code number:14
To enter the triskaidekaphobia therapy club,
Please enter the secret code number:13
Congratulations! You are cured!
嵌套循环
/*rowsl.c --使用嵌套循环 */
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main()
{
int row;
char ch;
for(row = 0;row < ROWS;row++) //外层循环
{
for(ch = 'A';ch<('A'+CHARS);ch++) //内部循环
printf("%c",ch);
printf("\n");
}
return 0;
}
运行该程序后,输出如下:
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
内部循环执行6次,内部循环执行10次。
使用函数返回值的循环示例
编写一个有返回值的函数,要完成以下内容:
- 1.定义函数时,确定函数的返回类型
- 2.使用关键字return表明待返回的值
double power(double n,int p) //返回一个double类型的值
{
double pow = 1;
int i;
for(i=1;i<=p;i++)
pow *=n;
return pow; //返回pow的值
}
声明函数的返回类型只需要在函数名前写出类型即可,就像声明一个变量那样。关键字return表明该函数将把它后面的值返回给主调函数。根据上面的代码,函数返回一个变量的值,返回值也可以是一个表达式的值。如:
return 2*x + b;