目录
前言
前面我们学习了C语言程序的基础组成知识,从本文开始,我将带领小伙伴们去了解和学习C语言中的各种语句及其使用的相关内容。
一、语句总览:
C语言的语句可以分为以下五类:
·表达式语句
·函数调用语句
·控制语句
·复合语句
·空语句
本文就将为小伙伴们分别对这五类语句进行介绍。
1.表达式语句:
由表达式加上分号“ ; ”组成,主要有算术表达式、赋值表达式、逗号表达式、关系表达式与逻辑表达式五大类。
a = b + c;
//算术表达式
int d = 0;
//赋值表达式
(表达式1,表达式2,表达式3,...)
//逗号表达式
//逗号运算符的优先级别在所有运算符中最低,逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值,运算过程为:从左往右逐个计算表达式
e == f;
//关系表达式
//关系表达式是指计算机程序中用关系运算符将两个表达式连接起来的表达式
g == h && i != j;
//逻辑表达式
//用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子称为逻辑表达式。逻辑表达式的值是一个逻辑值
...
2.函数调用语句:
由函数名、实际参数加上分号“ ; ”组成。其一般形式为:函数名(实际参数表);
printf("Hellow world !\n");
//printf函数是C语言标准库提供的常用函数之一
//由printf函数写成的语句也是最常用的函数调用语句之一
3.控制语句:
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种基本结构:顺序结构、选择结构、循环结构),它们由特定的语句订定义符组成。而C语言共有九种控制语句,可分为三类:
1.条件判断语句(分支语句):if语句、switch语句
2.循环执行语句:do while语句、while语句、for语句
3.转向语句:return语句、continue语句、break语句、goto语句
4.复合语句:
复合语句(Compound Statement)简称为语句块,它使用大括号把许多语句和声明组合到一起,形成单条语句。语句块与简单的语句不同,语句块不用分号当作结尾。用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句。对于一个函数而言,函数体就是一个复合语句。
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &b, &c);
{
a = b + c;
printf("%d", a);
}
return 0;
}
5.空语句:
表达式语句也可以只由一个“ ; ”分号组成,称为空语句,空句可以用于等待某个事件的发生,特别是用在while循环语句中。空语句中还可以用于为某段程序提供标号,表示程序的执行位置。当程序执行到空语句的时候,什么都不做,继续往下执行下面的语句,空语句不会影响程序的功能和执行顺序。与空行不同,程序执行到空行的时候会忽略空行,而不会在执行到时忽略空语句。
#include<stdio.h>
int main()
{
int a = 0;
for(a = 0 ; a <= 5 ; a++)
{
if(a == 4)
{
;
//空语句,没有执行代码,只有一个语句结束的标志,实际不执行而继续向下执行下面的语句
}
}
printf("%d", a);
return 0;
}
而在以上语句中,控制语句最为常用,也最为重要、复杂。本文即主要为各位小伙伴们介绍控制语句中的分支语句。
二、控制语句:
1.if语句:
①.语句基础:
首先我们来看 if 语句,顾名思义 if 即如果,即对表达式进行判定,判定结果为真则执行语句项,判定结果为假则不执行,它的语法结构为:
(注:在C语言中,0表示假,非0表示真 )
if(表达式)
{
语句项;
}
else
{
语句项;
}
//if语句常与else语句配合使用,判断为真则执行if语句,判断为假则执行else语句
可是这样能实现“分支”吗?答案自然是不可以,着用的语句只能用于实现判断而非分支,要想真正实现语句的分支,就需要else if语句的帮助。
举个例子:当用户输入年龄后,对用户年龄进行判断,小于12岁在屏幕上打印“儿童”字样,大于12岁且小于18岁则在屏幕上打印“青少年”字样,大于十八岁则打印“成年”字样,用代码进行实现应当写成以下示例:
#include<stdio.h>
int main()
{
int a =0;
printf("请输入您的年龄:");
scanf("%d", &a);
if(a >= 0 && a<12)
{
printf("儿童\n");
}
else if(a >= 12 && a < 18)
{
printf("青少年\n");
}
else
{
printf("成年\n");
}
return 0;
}
通过使用if(如果)、elsf if(或如果)与else(或)语句,我们就可以实现真正的分支语句功能了。其中if与else语句在一组分支语句中只能存在一个而else if语句可以有多个;if、else if与else语句后的语句项如果只有一句,则可以不用使用大括号{},一对大括号即为一个代码块。使用大括号括住的语句项将被视为一条语句进行执行(即视为复合语句)。
②.else悬空:
接下来我们还要了解一个概念:悬空else。
我们来看这样一段代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if(a == 1)
if(b == 2)
printf("b = 2\n");
else
printf("b != 2\n");
return 0;
}
小伙伴们认为这段代码的运行结果是什么呢?他会在屏幕上打印出什么内容呢?是“b = 2”还是“b != 2”呢?运行结果如下:
咦?为什么这段代码什么都没有输出呢?
这是因为在这段代码中出现了else悬空的情况。我们来分析一下这段代码,首先我们定义了a、b两个变量并对其进行了初始化,两数的值均为0,之后进行了第一次判断,由初始化a=0,判断条件a不等于1,为假则不执行。
这时侯肯定就有小伙伴们要发出疑问了,那后面不是有个else语句吗?为什么else语句没有执行呢?
下方else语句没有执行的原因是,else语句遵循就近原则,即自动跟距离最近的if语句进行配对,即else自动将自己视为判断条件b是否等于2的为假执行语句了,换句话说就是与在第一个if语句中嵌套的第二个if语句进行了配对。
我们把这段代码复制粘贴到VS 2022中会发现,VS 2022自动为我们整理了好了代码格式:
也就是说,这段代码的实际情况是:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if(a == 1)
{
if(b == 2)
{
printf("b = 2\n");
}
else
{
printf("b != 2\n");
}
}
return 0;
}
至此,else悬空的情况我们就搞清楚了,即else是和离他最近的if进行匹配的。
③.if语句书写形式的对比:
我们书写的代码也是有好有坏,其中主要的衡量标准有风格和效率等。风格的好坏决定了程序的可读性、易读性,好的代码风格既有利于我们对代码内容进行检查,便于查错,也方便他人阅读和理解我们的代码;代码的效率很大程度上决定了我们书写的代码的可移植性和使用成本,体积小功能全效率高的代码,有利于我们对软件进行维护和移植,更能从很大程度上减轻我们的程序对硬件设备的要求,大大减少我们的运营成本。
程序的效率,将在我们日后掌握较为牢固时进行考虑,我们应当对我们书写的代码进行不断优化以提高我们程序的效率。小伙伴们现在应当考虑的是,养成良好的代码书写习惯,在书写代码时,尽可能格式更为工整,语句更为准确。
同样,举例说明,小伙伴们来看看下面代码的运行结果是什么?
#include<stdio.h>
int main()
{
int a = 0;
if(a = 5)
{
printf("%d", a);
}
return 0;
}
运行结果如下,是不是很奇怪?
为什么会打印数字5呢?初始化a=0,判断条件a不等于5,应当不执行输出才对呀,哪里出了问题呢?
这是因为在上述代码中,if判断条件中错误的使用了单等号“ = ”,而在C语言中“ = ”表示赋值,双等号“ == ”才表示判断条件“相等”,导致此处a被赋值为5,不等于0,判断为真,执行输出a=5。由此可见,在我们的程序代码中,哪怕只是一个小小的等号的使用错误,都有可能会导致程序运行结果的差错。
这里,我建议各位小伙伴们可以将代码写成如下形式:
#include<stdio.h>
int main()
{
int a = 0;
if (5 == a)
{
printf("%d", a);
}
return 0;
}
即在判断条件时,将常量写在左边,可以有效避免此类问题的出现。如果误写成单等号,编译器将会报错“表达式必须是可修改的左值(左为常数不可修改)”而不会运行:
④.经典if语句例题(自我练习):
1.判断一个数字是否为奇数
2. 输出1-100之间的奇数
2.switch语句:
接着我们来学习switch语句的相关语法。
switch语句语是一种分支语句,常常用于多分支的情况。多分支语句中,写成if...else if...else if...else if...else...的形式太复杂也太繁琐,所以我们就需要不一样的语法形式,这就是switch语句。
①.语句基础:
首先我们来看switch语句,顾名思义switch即开关,它就像带有一组开关的排插,即读取整形常量表达式后进行分支判断,执行整型常量表达式指定的分支语句(case标签语句的值与整型常量表达式相等的分支),且switch语句允许嵌套使用。它的语法结构为:
switch(整形常量表达式)
{
case 1:
语句项;
case 2:
语句项;
...
}
同样的,单一的switch语句无法直接实现分支,也需要搭配另一个(转向)语句break才能实现真正的分支。break语句的作用为终止(跳出)当前代码块,在switch语句中的实际作用为将语句列表划分为不同的分支部分。即case决定入口,break决定出口。
例如:
#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后,switch语句读取到我们输入的数字1,于是执行case 1语句,输出“星期一”后执行break语句结束分支语句(其他分支同理)。如此,我们实现了真正的多分支语句。
但是我们对于break语句的使用也会根据我们程序的执行需求发生变化,比如我们的需求可能变化为输入1-5时打印“工作日”字样,而输入6、7时打印“休息日”字样,则我们的代码可以书写为:
#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:
case 7:
printf("休息日\n");
break;
}
return 0;
}
以上代码完全可以实现我们的需求:输入1-5时,case1-5决定分支的入口,并在打印“工作日”字样后由break语句决定的分支语句出口跳出;输入6、7时,case6、7也同理决定分支语句入口,并在打印“休息日”后由break语句决定的分支语句出口跳出。
②.default子句:
如果整型常量表达式的值与所有标签的值都不匹配对程序本身没有影响,运行结果也只是跳过所有switch语句而已,程序既不会报错也不会停止。但如果我们不想忽略不匹配结果时,又该如何实现呢?这种情况我们可以通过在switch语句中添加一条default子句来实现。如:
#include<stdio.h>
int main()
{
int a = 0;
printf("请选择您的性别(0/1):\n");
scanf("%d", &a);
switch(a)
{
case 1:
printf("您是男生\n");
break;
case 0:
printf("您是女生\n");
break;
//除输入0或1外,均执行default子句:
default:
printf("输入错误\n");
break;
}
return 0;
}
default子句可以出现在switch语句列表的任意位置,且语句流会像处理case标签一样去处理default子句。当switch表达式的值不匹配所有case标签时,default子句就会被执行,所以,每个switch语句中最多只能出现一条default子句。
对于各位小伙伴们来说,在每个switch语句中都放置一条default子句是个好习惯(哪怕不使用,是一种良好的代码编写习惯),最好在default子句后再加一个break语句。
以上就是需要小伙伴们掌握的分支语句的全部内容啦!坚持下去,你的汗水全都会化为明天的光明!文中的例题也希望小伙伴们多动脑筋,独立思考尝试解决,如果有疑问欢迎随时私聊!
新人初来乍到,辛苦各位小伙伴们动动小手,三连走一走 ~ ~ ~ 最后,本文仍有许多不足之处,欢迎各位看官老爷随时私信批评指正!