引言
什么是语句?
通俗来讲:C语言中由一个分号;隔开的就是一条语句
C语言中的1语句分类,可以分位以下五类:
表达式语句,函数调用语句,控制语句,复合语句,空语句。
#include<stdio.h> int main() { 3 + 5;//表达式语句 printf("haha\n");//函数调用语句 ;//空语句 //有时候我们需要一条空语句,但是这条语句什么都不需要做,就可以使用 return 0; }
本篇博文主要是介绍控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构的方式(C语言是一种结构化的程序设计语言——C语言支持三种结构:顺序结构,选择结构,循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
三类:
条件判断语句也叫分支语句:if语句,switch语句;
循环执行语句:do while语句,while语句,for语句;
转向语句:break语句;goto语句;continue语句,return语句。
分支语句
if语句
语法结构
首先,我们先要了解if语句的语法结构是怎么样的?
if(表达式)//表达式为真则执行;表达式为假则不执行。0为假,非0为真 语句;
if(表达式) 语句1; else 语句2;
if(表达式1)//多分支 语句1; else if(表达式2) 语句2; else 语句3;
关于在C语言种如何表示真假?
练习
接下来我们来练习一下:
//练习1:输入一个整数代表年龄, // 若大于等于18,则输出成年人 //否则输出未成年人
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (age >= 18) printf("成年人\n"); else printf("未成年人"); return 0; }
如果我们想要实现多分支呢?
上面我们提到的三种语法结构都可以使用嵌套。
//练习2 //输入年龄数字 //输出对应的年龄 //age<18 未成年 //18~30 青年 //31~50 中年 //51~70 中老年 //71~99 老年 //>99 老寿星
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (18>age) printf("青年\n"); else//age>=18范畴 { if (age >= 18 && 30 <= age) printf("青年"); else//age>30的范畴 { if (age >= 31 && 50 <= age) printf("中年"); else//age>50的范畴 { if (age >= 51 && 70 <= age) printf("中老年"); else//age>70的范畴 { if (age >= 71 && 99 <= age) printf("老年"); else//age>99的范畴 { if (age > 99) printf("老寿星"); } } } } } return 0; }
嵌套之后非常冗长,那我们能不能简化以下呢?
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (18 > age) printf("青年\n"); else if (30 >= age) printf("青年"); else if (50 >= age) printf("中年"); else if (70 >= age) printf("中老年"); else if (99 >= age) printf("老年"); else printf("老寿星"); return 0; }
//练习3 //判断一个数是否为奇数
//练习:判断一个数是否为奇数 #include<stdio.h> int main() { int a = 0; scanf("%d", &a); if (a % 2 != 0) printf("奇数"); else printf("偶数"); return 0; }
//练习4 //输出1~100之间的奇数
//练习:输出1~100之间的奇数 #include<stdio.h> int main() { int a = 0; while (a <= 100) { //必须要加{},while只能控制一条语句。 a++; if (a % 2 != 0) printf("%d ", a); } return 0; }
注意的tips
NO1.限制条件的范围写法
为什么此刻输入50,屏幕上也打印了青年?
这是因为编译器先执行了18<=age这条语句为真,则为1;又执行了1<=30这条语句也为真,则可以输出青年。所以我们在取范围时,应该用&&或者||等。
NO2.代码块
为什么12未成年也可以执行谈恋爱?
因为if语句只能控制其他一条语句。若要控制多条需要用代码块
NO.3悬空的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匹配,而是和它离的最近的if匹配。那以上的写法很容易就看错。
所以我们注意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; }
NO.4代码的书写形式
关于减少代码的错误,这里还有小的技巧。
#include<stdio.h> int main() { int a = 10;//= 赋值符号 //if (a == 5)//== 等于符号 //如果二者搞混,编译器不会报错,寻找错误很麻烦,如果代码很长 if(5 == a)//所以可以这么写 printf("hehe\n"); else printf("haha\n"); return 0; }
要想养成良好的代码风格,在平时练习中,我们就需要去注意。同时这里也推荐一本书《高质量的C C++编程》
switch语句
特别是,switch语句和if语句不能强制套用,还得分情况合理使用两种分支语句。
语法结构
switch(整型表达式)//需要强调是“整型”
{
语句项(case:语句);//是一些case语句,case:整型常量表达式语句
}
switch语句中的break
实例1: //输入1,输出星期一 //输入2,输出星期二 //输入3,输出星期三 //输入4,输出星期四 //输入5,输出星期五 //输入6,输出星期六 //输入7,输出星期七
明明我只想要输出星期三但是却把后面全部打印出来了?这就是缺少break。
在switch中我们没办法实现分支,但是搭配上break我们就可以实现break。
#include<stdio.h> int main() { int a = 0; scanf("%d", &a); switch(a) { 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; }
实例2: 1. 输入1-5输出的是“weekday”; 2. 输入6-7输出“weekend”;
#include<stdio.h> int main() { int a = 0; scanf("%d", &a); switch (a) { 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语句的实际作用效果就是把语句列表划分为不同的部分。
switch语句中的default子句
default子句
如果表达的值余所有case标签的值都不匹配怎么办?
其实也没什么,结果就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值该怎么办?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个case标签可以出现的位置。
当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。
所以,每个swutch语句中只能出现一条default子句。
但是它可以出现在列表任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
就像上面实例1中,我想输入有与8匹配的case标签是“选择错误,请重新输入值”,那该去写呢?
#include<stdio.h> int main() { int a = 0; scanf("%d", &a); switch(a) { 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; default: printf("选择错误,请重新输入值"); } return 0; }
以上就是我们全部的分支语句讲解,这里有一个练习,可以思考一下?m,n的值?
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n); return 0; }
——————→m=5,n=3
循环语句
在前面我们学习了分支语句,但是这个语句要么不执行,要么只能执行一次。但是在我们生活当中,我们需要一件相同的事情重复做。那我们要怎样去做?
C语言中给我们引入了:循环语句。
while循环
语法结构
//while循环的语法结构
while(表达式)
循环语句;
while循环中的continue
#include<stdio.h> int main() { int i = 0;//循环变量 while (i <= 10)//判断条件 { i++; if (i == 4) continue; printf("%d ", i); }//循环语句 return 0; }
总结:continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环入口的判断。
while循环中的break
#include<stdio.h> int main() { int i = 0;//循环变量 while (i <= 10)//判断条件 { i++; if (i == 4) break; printf("%d ", i); }循环语句 return 0; }
总结:break在while循环中的作业:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。