前言
在生活中,我们所做的每一种行为,都是顺序、选择、循环后的结果,而在C语言中,也存在着这些特殊的机构,用于应对现实中错综复杂的情况,使得编程更有现实性和实用性。
一、什么是语句
C语句可以划分为一下五大类:
1.表达式语句
1.1 C语言中的语句全部是表达式语句,表达式 语句由表达式和分号构成。表达式主要有:赋值表达式,逗号表达式,以及函数调用表达式等。
1.2 C语言中赋值语句使用的是一种运算符“=”。只要在赋值表达式后面加上分号,就构成了一条语句,例如:
a=b=5;
ch=getchar();
2.函数调用语句
函数调用语句:把函数调用单独作为一个语句。例如:
printf_star();
3.控制语句
本章详解内容
4.复合语句
各种语句嵌套使用
5.空语句
由一个分号单独组成的语句。例如:
;
控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句: if 语句、 switch 语句;
2. 循环执行语句: do while 语句、 while 语句、 for 语句;
3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。
二、分支语句(选择结构)
2.1 if语法
2.1.1 语法结构
//只有一个if
if(表达式)
语句;
//if和else组合
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达句2)
语句2;
else
语句3;
代码演练:
#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)//如果输入的数据小于18就输出未成年!
{
printf("未成年\n");
}
return 0;
}
//代码2
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)//如果输入的数据小于18就输出未成年!
{
printf("未成年\n");
}
else//如果输入的数据等于或大于18就输出成年-这里省略了else的表达式age>=18(一般都是省略的)
{
printf("成年\n");
}
return 0;
}
//代码3
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");
}
return 0;
}
补充:
1.当只有一个if的时候,如果else中语法列表只有一个表达式,则else可以省略,但不推荐。
2.在C语言中,0表示为假,非0表示为真.
2.1.2代码块
如果条件成立,要执行多条语句,应该怎么书写呢?
#include <stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一堆{ }表示的就是一个代码块,在使用if语句的时候,无论语句列表有多少行都应该带上
{ },养成可以好习惯,可以避免很多错误以及方便调试。
2.1.3悬空else
else匹配:else只和它离得最近的if匹配。例:
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(a==1),而是if(b==2)这个if。
2.2 if书写新式的对比
//代码1
if(hellobite){
return x;
}
return y;
//代码2
if(hellobite)
{
return x;
}
else
{
return y;
}
这样子书写的代码虽然表达意思相同,但明显的第一种代码风格偏差,读起来相比于第二种更吃力,可读性不强,而且不方便调试,使用在书写的时候最好引用第二种代码风格,每一个if和else都用{ }把语句列表括起来。
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
代码4相比于代码3,但书写时可以有效的避免了与上行相同表达式的视觉错觉,如果养成一个好习惯,在以后的书写多行代码或者长期工作过程中不会因为疲劳而导致类似这种视觉错觉而少加了个=或者书写错误的bug出现,也方便代码的调试。
2.3 switch语句
实际生活中,需要做出很多选择,大家都知道做选择可以使用if语句,但是如果选择太多,if语句使用起来就会很繁琐,这个时候如果用switch语句,就可以很高程度简化代码。
switch语句是一个多分支选择语句,并且可以支持嵌套。
2.3.1switch语句的基本格式
switch(整形表达式)
{
case 常量1:语句1
case 常量2:语句2
default:语句n
break;
}
switch语句通过将表达式的值与常量值进行比对,如果相等则执行后面的语句,如果不相等则跳到下一个case语句,当表达式和常量值相等,switch语句会将当前case语句以及后面所有的case语句全部输出。假如我们要实现用户输入一个数字来判断今天是星期几,那么就可以用下面的代码实现。
#include <stdio.h>
int main()
{
int day = 1;
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;
}
注:switch中的表达式一定得是整形表达式,用浮点型float以及double都是错误的。
2.3.2switch语句中的break
break语句:当switch语句运行时遇到break关键字时会跳出,意思就是当语句运行到break时就不再运行了,也就是break后剩下的case语句都不会再执行,switch语句结束。
在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。(如2.3.1代码)
如果语句是空语句,那可以和break结合,如:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
这样子只要输入是1到5的数,都会显示工作日,反则如果输入6或者7,则输出休息日。
编程好习惯:
在最后一个 case 语句的后面加上一条 break 语句。
(之所以这么写是可以避免出现最后一个 case 语句后面忘了添加 break 语句)。
2.3.3 default语句
简单的说,就是执行除了case之外的情况
如何理解呢,下面我用代码给你演示一下
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("工作日\n");
break;
case 6:printf("休息日\n");
break
case 7:printf("休息日\n");
break;
default:printf("请重新输入\n");
break;
}
return 0;
}
当输入的值不为1到7的时候,就会输出”请重新输入“这一行代码。
编程好习惯:
在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break 。