目录
C语言是结构化的程序设计语言,分为顺序结构、选择结构和循环结构。为什么这么说呢?其实这三种结构来自于生活,我们在生活中做的事情无非就三类,第一类就是从头走到尾,一步一步地做,就是C语言的顺序结构;第二类是我们可能会做出一种选择,比如说,有的同学选择考研,有的同学选择就业,就会使人生走的路不同,这就是C语言的选择结构;第三类是我们可能要循环往复地重复做一件事情,这就是C语言地循环结构。顺序结构比较简单,一步一步走就行了,下面讲一下选择语句和循环语句。
可分成以下三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
一、分支语句(选择结构)
分支语句地基本结构如下:
1.1 if语句
语法结构:
if (表达式)
语句;//双分支
if (表达式)
语句1;
else
语句2;
//多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
代码举例
//代码1
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
{
printf("不及格");
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
printf("不及格");
else
printf("及格");
return 0;
}
//代码3
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
printf("不及格");
else if (score >= 60 && score <= 80);
printf("良好");
else if (score >= 80 && score <= 90);
printf("优秀");
return 0;
}
如果括号里地表达式结果为真,语句执行,结果为假,则语句不执行。
0表示假,非0表示真
如果条件成立要执行多条语句,要使用代码块,如果只执行一条语句可以不加大括号。
#include <stdio.h>
int main()
{
if (表达式)
{
语句列表1
}
else if
{
语句列表2
}
return 0;
}
这里的一对{ }就是一个代码块。
else的悬空
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
在上面代码中,肉眼是看else是和第一个if对齐的,可能会误导我们认为输出“haha”,但运行结果是什么也不输出,因为else是和它离得最近的if匹配的,所以程序压根就没有进入第二个if语句中。修改结果如下:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
1.2 switch语句
switch语句也是一种分支语句,常常用于多分支情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
如果还采用if…else的形式太过复杂,因此我们采用switch语句。
switch(整形表达式)
{
case 整型常量表达式:
语句;
}
例如:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
int n = 1;
switch(day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
上列代码运行结果如下:
当输入2时,进入switch语句后就会从case 2一直运行下去直到结束,要想终止语句,需要用到break关键字。
这时输入几就从对应的case语句运行,并终止后面的语句。
default子句
如果表达式的值与所有的case标签的值都不匹配,所有的语句就会都被跳过。然而程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。如果不想忽略不匹配所有标签的表达式的值时,可以在语句列表中增加一条default子句。当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句就会像执行一个case标签一样执行default子句。
二、循环语句
循环语句分为:
while
for
do while
2.1 while循环
while语句执行的流程:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d", i);
i++;
}
return 0;
}
//打印1~10
当while表达式判断结果为真,就会进入循环体执行语句,当循环到使while表达式判断结果为假时,就会跳出循环。
while语句中的break和continue
在while语句中,只要遇到break,就会直接终止循环。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d", i);
i++;
}
return 0;
}
上述代码,当循环到i等于5时就会终止循环,所以打印结果为:
在while语句中,continue是用于终止本次循环的,也就是在本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的判断。
#include <stdio.h>
int main()
{
int i = 0;
while (i < = 10)
{
i++;
if (i == 5)
continue;//跳过本次循环continue后边的代码, 直接去判断部分判断
printf("%d ", i);
}
return 0;
}
//打印结果为1 2 3 4 6 7 8 9 10
2.2 for循环
语法形式:
for(表达式1;表达式2;表达式3;)
循环语句;注:
表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。
使用for循环打印1~10
#include <stdio.h>
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
printf("%d ", i);
}
return 0;
}
for 语句的执行流程
进入for循环后,先对初始化部分进行赋值,然后执行判断语句,判断结果若为真,执行循环语句,若为假,则不执行循环。当然,for循环语句中也有break和continue关键字,for语句中的break关键字和在while语句中是一样的,for语句遇到continue后会跳过后面的语句,然后进入调整部分。
建议:
1.不可在for循环体内修改循环变量,防止for 循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
2.3 do…while()循环
语法形式:
do
循环语句;
while(表达式)
do…while()语句执行流程:
#include<stdio.h>
int main()
{
int i=10;
do
{
printf("%d\n",i);
}while(i<10)
return 0;
}
do…while时先执行后循环,所以循环至少执行一次。首先执行一下要循环的语句,随后进行判断是否进行下一次的循环。当遇到break退出循环,遇到continue,后面的语句不再执行,结束本次循环,进行下一次循环。
三、goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
for(……)
for(……)
{
for(……)
{
if(disaster)
goto error;
}
}
-
error:
if(disaster)
//处理错误情况
遇到goto语句后,程序会直接跳转到goto后面标号(error)的位置