1.分支语句(选择结构)
1.1if语句
if语句的语法形式如下:
if ( 表达式 ) 表达式为真(非0),执行语句;表达式为假(0),不执行;语句 1 ;
2. if ( 表达式 )语句 1 ;else语句 2 ;
3. if ( 表达式 1 )语句 1 ;else if ( 表达式 2 )语句 2 ;else语句 3
代码如下:
1.
#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);//输入年龄
if(age<18)
{
printf("未成年\n");
}
如果输入年龄是小于18的整数,表达式为真,输出为未成年;若输入大于等于18的整数,表达式为假,则跳过这个if语句。
2.
//代码2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
如果输入年龄是小于18的整数,表达式为真,输出为未成年;若输入大于等于18的整数,则执行else后的语句,输出成年。
3.
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}
输⼊⼀个⼈的年龄 ,如果年龄<
18
岁,打印
"
少年
" 。
如果年龄在
18
岁⾄
44
岁打印
"
⻘年
" 。
如果年龄在
45
岁⾄
59
岁打印
"
中⽼年
" 。
如果年龄在
60
岁⾄
89
岁打印
"
⽼年
" 。
如果
90
岁以上打印
"
⽼寿星
"。
注意:1.if 和 else 后都只能控制一条语句,如果要控制2条语句及以上需要用 {} 将控制语 句括起来。2.else if 可以使用多次。3.悬空 else 问题,else 总是和最接近的 if 匹配。
1.2.switch语句
if语句的语法形式如下:
switch ( 整型表达式 ){case value1: statementcase value2: statementdefault : statement}
上⾯代码中,根据表达式整形表达式
不同的值,执⾏相应的
case
分⽀。如果找不到对应的值, 就执⾏ default
分⽀。
注意:
• switch 后的 expression 必须是整型表达式• case 后的值,必须是整形常量表达
示例代码:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("周一\n");
break;
case 2:
printf("周二\n");
break;
case 3:
printf("周三\n");
break;
case 4:
printf("周四\n");
break;
case 5:
printf("周五\n");
break;
case 6:
printf("周六\n");
break;
case 7:
printf("周日\n");
break;
}
return 0;
}
1.2.1 在switch语句中的 break
在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
有时候我们的需求变了:1. 输入1-5,输出的是“周三”;2. 输入6-7,输出“周日“;
#include <stdio.h>
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
break 语句 的实际效果是把语句列表划分为不同的分支部分。
编程好习惯
在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
1.2.2 default子句
如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行 default子句。
编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
2.循坏语句
2.1while循环
//while 语法结构while ( 表达式 )循环语句 ;
while
语句执行的流程:
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断
比如我们实现:
在屏幕上打印1-10的数字
int main()
#include <stdio.h>
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:
2.1.1 while语句中的break和continue
break介绍
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i+1;
}
return 0;
}
执⾏的结果:
1234
打印了1,2,3,4后,当i等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。 所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。
continue
介绍
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i+1;
}
return 0;
}
到这里我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接 到循环的判断部分,进行下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。
2.2 for循环
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )循环语句 ;
表达式1表达式1为初始化部分,用于初始化循环变量的。表达式2表达式2为条件判断部分,用于判断循环时候终止。表达式3表达式3为调整部分,用于循环条件的调整。
for
循环的执行流程图
首先执行表达式1 初始化循环变量,接下来就是执行表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束;表达式2 的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3 ,调整循环变量,然后再去 表达式2 的地方执⾏判断,表达式2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环
比如我们实现:
在屏幕上打印1-10的数字
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
执行结果:
1 2 3 4 5 6 7 8 9 10
2.2.1 for循环中的break和continue
break举例
其实和 while 循环中的 break ⼀样, for 循环中的 break 也是用于终止步循环的,不管循环还需 要循环多少次,只要执行到了 break ,循环就彻底终止,我们上代码。
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
执行结果:
1 2 3 4
break
的作用是永久的终止循环,未来我们在某个条件发生的时候,不想再继续循环的时候,就可以 使用 break
来完成。
continue举例
上面的代码,如果把
break
换成
continue
会是什么结果呢?
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue 来实现。
2.2.2一些for循环的变种
for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
1.
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
执行结果:
三个表达式均省略,为无限循环,表达式2为条件判断部分,用于判断循环时候终止。,程序中应该避免这种情况的发生。
2.
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}
执行结果:
那么为什么是3次,而不是9次呢,这是因为当i=0的时候,j=0执行三次后打印了三次hehe后j=3,当i=1时,因为j=3,并不满足j的循环条件,所以只能打印三次hehe。
2.3 do while循环
do
语句的语法:
do循环语句 ;while ( 表达式 );
while
和
for
这两种循环都是先判断,条件如果满⾜就进⼊循环,执行循环语句,如果不满足就跳
出循环;
而do while
循环则是先直接进入循环体,执行循环语句,然后再执行
while
后的判断表达式,表
达式为真,就会进行下⼀次,表达式为假,则不再继续循环。
执行流程
do 语句的特点 :循环至少执行一次,使用的场景有限,所以不是经常使用
比如我们实现:
在屏幕上打印1-10的数字
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
执行结果:
2.3.1 do while循环中的break和continue
do while 语句中的 break 和 continue 的作用和 while 循环中几乎⼀模⼀样,⼤家下来可以测试并体会。
break举例
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(5 == i)
break;
printf("%d ", i);
i=i+1;
}while(i<=10);
#include <stdio.h>
int main()
return 0;
}
continue举例
#include <stdio.h>
int main()
return 0;
}
{
int i = 1;
do
{
if(5 == i)
continue;
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
运行结果是什么呢,大家快点自己动手试试吧!
2.4 goto语句
C 语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码。但是某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)