C语言是结构化的程序设计语言,有顺序结构、分支结构、循环结构。
一.什么是语句
C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句(一个分号)
二.分支语句(选择语句)
什么是选择语句?
如果你好好学习,毕业就能找到好工作
如果你不学习,毕业你就失业了。逻辑图如下
1.1 if语句
①语法结构
//1 单分支 if(表达式)// 当表达式为真,语句执行 语句; //2 双分支 if(表达式) 到表达式为真,语句1执行;否则执行语句2 语句1; else 语句2; //3.多分支 if(表达式1) 语句1; else if(表达式2) //表达式1为真,执行语句1;表达式1为假,表达式2为真,语句2执行;表达式1为 假,表达式2也为假,语句3执行。 语句2 else 语句3;
//C语言中规定,0就是假,非0为真。
例子:
//注:默认情况下if语句后面只能跟一条语句,当if语句后面需要跟多条语句时,可以用大括号”{ }“ (代码块)将所有语句括起来。
1.2 悬空else
当我们写了如下的代码时,输出的结果是hehe还是haha呢?
#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,所以 else 与if(b=2)是一对,因此输出结果啥也没有。当我们写if语句时,用代码块将每一层语句都括起来,使得代码逻辑清晰。
2. switch语句
2.1常常用于多分支情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日如果用if ,else if ,else的形式写代码会很麻烦,如果我们用switch语句就会简单很多。
int main() { int day = 0; scanf("%d", &day); //if (1 == day) // printf("星期一"); //else if (2==day) // printf("星期二"); //else if ..... //.... return 0; }
switch语句语法结构
switch(整型表达式) { 语句项; }
语句项是一些case语句
case 整形常量表达式: 语句;
2.2在switch语句中的 break语句。
①
当我们用运行下列代码时,输入数字1,我们想要的结果是星期1,但是所有星期的天数都会打印出来。
原因是switch语句在执行时,如果代码只存在单纯的case语句,当我们输入1时,实行完case1内部的语句后,会自动执行下一个case语句的内容,直到走完整个switch语句。如果我们要实现switch语句的分支,需要搭配break。
②当我们把每周划分为工作日和周末,有以下代码
输入12345时,将打印出工作日;输入67时,打印出周末。
所以,break语句的实际效果是把语句列表划分为不同的分支部分。
再写switch语句时,我们尽量在case语句后面加上break语句。
2.3 default子句
当表达的值与所有case标签的值都不匹配的时候,程序不会终止 ,也不会报错,在C语言中并不认为这种情况是个错误,结果只是所有的语句都被跳过而已。例:
如果如果你并不想忽略不匹配所有标签的表达式的值,你可以在语句列表中增加一条default子句(default:)。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置(可以理解为switch语句先执行case子句,当所有case子句都不匹配时,才会执行default子句,与代码顺序无关),而且语句流会像执行一个case标签一样执行default子句。
//1 int main() { int a = 3; switch (a) { default: break; case 1: printf("haha\n"); //default: // break; case 2: printf("hehe\n"); //default: // break; case 3: printf("xixi\n"); //default: // break; case 4: printf("oooo\n"); //default: // break; } return 0; }
//不管default子句在switch语句内部的哪一行,输出结果都一样。
//在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
3.循环语句 while for do while、
循环:同一件事情我们需要完成很多次
流程图
3.1whlie循环
语法结构
while(表达式) 循环语句;
例子:打印1~10.
定义变量a=1,判断a<=10后进入while循环,先打印a,然后a自增;然后再次判断自增后的a与10比较大小,直到表达式为假循环结束。
3.1.2while语句中的break和continue
①break
当我们在1~10这几个数字中按顺序打印时,规定只能打印出1~4 这4个数,打印出4之后后面的循环终止,这种情况下我们可以 使用break来终止while循环,只需要多加一行判断代码,判断数字是否大于等于5,然后用break终止循环。例:
//break在while循环中的作用:在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
②continue
那如果还是上述代码,将break换成continue,会发生什么呢?例:
我们发现,当打印出4之后,编译器既没有打印出其他东西,也没有停止。原因是:当a=5时,执行了continue,而continue的作用是:用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
所以在这段代码中,a=5一直在循环,陷入了死循环。
3.2 for循环
语法结构
for(表达式1; 表达式2; 表达式3) 循环语句
表达式1为初始化部分,用于初始化循环变量的;
表达式2为条件判断部分,用于判断循环时候终止;
表达式3为调整部分,用于循环条件的调整。
流程图
对比一下for循环和while循环
int i = 0; //实现相同的功能,使用while i=1;//初始化部分 while(i<=10)//判断部分 { printf("hehe\n"); i = i+1;//调整部分 } for(i=1; i<=10; i++) { printf("hehe\n"); }
我们可以发现在while循环中存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
3.2.2for循环中的break和continue
for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异。例子:在a=5的时候,continue与会终止本次循环,但是仍会执行表达式3(a++),使得a继续自增,a!=5那么循环继续正常进行,直到a>10。这种情况下for循环不会进入死循环,这是与while循环的区别。
特别建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
3.3 do while
3.3.1语法结构
do 循环语句; while(表达式);
3.3.2 执行流程
3.3.3特点
循环至少执行一次
定义变量 i=10,创建do while循环,定义while的表达式 i<10。我们发现输出结果打印了一次10;说明do while循环进行了一次。
3.3.4do while 循环中的break和continue
①break:和while、for循环一样当代码执行了break,循环终止。
②continue:跳过本次循环,执行下一次循环。例:
这段代码打印了除5之外的9个数。