什么是语句
在C语言中有以下几种语句:
- 表达式语句;
- 函数调用语句;
- 控制语句;
- 复合语句;
- 空语句。
- 控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
分支语句(选择结构)
主要是根据条件的不同用来选择不同的结果。
if语句
if语句可以分为以下三类:
- 单分支if
- 双分支if…else
- 多分支if…else if…else if…else
单分支if
语法结构:
if(表达式) { 语句; }
案例:
#include<stdio.h> int main() { int age=0; scanf("%d",&age); if(age<18) { printf("未成年"); } }
如果输入的数大于18那么程序就没有结果出现,这符合我们生活中的选择,因为任何一种选择在生活中都会产生结果,所以我们有引入了双分支和多分支if,能够更加的贴近我们的生活。
双分支if
语法结构
if(表达式) 语句1; else 语句2;
案例:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (age>18) { printf("成年"); } else { printf("未成年"); } return 0; }
可以得到的结果就是成年和未成年两种结果,但是我还想要在成年中分为青年、中年、老年,很显然要是还是使用双分支if的话就有点麻烦了,所以就需要使用到多分支if。
多分支if
语法结构:
if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3;
案例:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (age<18) { printf("未成年"); } else if (age>=18&&age<30) { printf("青年"); } else if (age >= 30 && age < 50) { printf("中年"); } else { printf("老年"); } return 0; }
可以看出来当条件大于2个以上时,使用多分支if可以让代码结构更加的舒服。
如果表达式的结果为真,则语句执行。 在C语言中如何表示真假?
非0为真,0为假。
switch语句
switch语句也是一种分支语句,他适用与多分支,但是他的判断条件必须是整型表达式。
语法结构:
switch(整型表达式) { 语句项; }
语句项是什么呢?
case 整形常量表达式: 语句;
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
比如:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期天"); break; } return 0; }
如果我们需要把周一到周五改成工作日,周六周天改成休息日,我们的代码可以改成以下形式:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日"); break; case 6: case 7: printf("休息日"); break; } return 0; }
break语句 的实际效果是把语句列表划分为不同的分支部分。
如果我们输入的数字不是1到7而是其他的数字,那么我们的程序也是没有结果出现的呢,所以这不符合我们生活,那么我们就可以在switch语句中加入defalut字句。
如下:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日"); break; case 6: case 7: printf("休息日"); break; default: printf("输入错误"); break; } return 0; }
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
循环语句
在c语言中有以下几种循环:
- while
- for
- do while
while循环
语法结构:
while(表达式) 循环语句;
案例:
#include<stdio.h> int main() { int i = 1; while (i<=10) { printf("%d ", i); i++; } return 0; }
在while循环中可以使用break和 continue
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) { break; } printf("%d ", i); i++; } return 0; }
这个程序的结果就是当i=5时通过break跳出循环打印的结果为1 2 3 4 。 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环 。
如果把循环中的break换成continue会怎么样呢
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) { continue; } printf("%d ", i); i++; } return 0; }
这个程序会出现死循环的结果,打印1 2 3 4 然后死循环。
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
for循环
语法结构:
for(表达式1; 表达式2; 表达式3) 循环语句;
- 表达式1 表达式1为初始化部分,用于初始化循环变量的。
- 表达式2 表达式2为条件判断部分,用于判断循环时候终止。
- 表达式3 表达式3为调整部分,用于循环条件的调整。
#include<stdio.h> //循环打印1-10 int main() { for (int i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
do…while()循环
语法结构:
do 循环语句; while(表达式);
循环至少执行一次,然后再判断是否接着循环。
#include <stdio.h> int main() { int i = 1; do { printf("%d ", i); i=i+1; }while(i<=10); return 0; }
一定要注意是do…while循环中的判断后面要加上英文的分号。
在do…while循环中也可以出现break和continue,他们的意义和在while、for循环中是一样的。
goto语句
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
只有使用goto语句可以直接跳出多层循环。
goto循环使用的场景:
for(...) for(...) { for(...) { if(disaster) goto error; } } … error: if(disaster)
使用案例:
#include<stdio.h>; int main() { char input[10] = { 0 }; system("shutdown -s -t 60"); while (1) { printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>"); scanf("%s", input); if (0 == strcmp(input, "我是猪")) { system("shutdown -a"); break; } } return 0; }