在之前的的两节文章当中,我们简单了解了C语言的基本组成,从本文开始,我们要开始学习C语言当中的各种语句的具体使用的相关内容。
在C语言当中语句可以分为五大类,它们分别是:
表达式语句主要是由表达式加上分号";"组成;具体分类可以分为:算术表达式、赋值表达式、逗号表达式、关系表达式、逻辑表达式这五大类。
x = y + z;
//算术表达式
int i = 0;
//赋值表达式
int a = 1;
int b = 2;
int c = 3;
(a = b + c, b = a - c; c = b - a;)
//逗号表达式
//逗号表达式的优先级别最低,它的最后值为最后一个表达式;运算过程为从左到右
if(a == 1)
//关系表达式就是计算机程序当中用关系运算符将两个表达式连接起来的句子
if(a >= 1 && a < 3)
//逻辑表达式就是将关系表达式用逻辑运算符连接起来的有意义的式子称为逻辑表达式,它的值为一个逻辑值
函数调用语句主要是由函数名、实际参数加上分号";"组成。一般形式为:函数名(实际参数);
printf("Hello World\n");
//printf函数就是C语言的库函数之一
//printf函数也就是最常用的函数调用语句之一
所谓控制语句就是用于控制程序的执行流程,以用来实现程序的各种结构方式。C语言支持三种结构:顺序结构、选择结构、循环结构,它们由特定的语句定义符组成,C语言有9种控制语句。
复合语句(Compound Statement)简称为语句块,它使用大括号把许多语句和声明组合到一起,形成单条语句。语句块与简单的语句不同,语句块不用分号当作结尾。用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句。对于一个函数而言,函数体就是一个复合语句。
#include
int main()
{
int x = 0;
int y = 0;
int z = 0;
scanf("%d %d",&x,&y);
{
z = x + y;
printf("%d\n",z);
}
return 0;
}
表达式语句也可以只由一个“ ; ”分号组成,称为空语句,空句可以用于等待某个事件的发生,特别是用在while循环语句中。空语句还可以用来为某段程序提供标号,表示程序的执行位置。
#include
int main()
{
int i = 0;
for(i = 1; i<10; i++)
{
if(i == 2)
;
//空语句,没有执行代码,只是一个语句结束的标志,实际上不会执行而执行下面的语句
}
printf("%d\n",i);
return 0;
}
if语句顾名思义就是如果的意思,if语句主要就是对表达式进行判断,如果为真则执行语句项,如果为假则不会执行语句项。语法结构为:
(在C语言当中,0表示假,非0表示真)
if(表达式)
{
语句项;
}
else
{
语句项;
}
//if语句一般情况下都和else语句一起使用,判断为假则使用else语句
if-else语句主要是实现判断,若语句为真,则主要执行if后面的语句项,若为假,则执行else后面的语句项。
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
如果想要实现多分支结构,那么就需要else-if语句的帮忙了。
举个简单的例子:比如年龄在18以下为未成年,年龄在18 ~ 30之间为青年,在30 ~ 50之间为中年,在50 ~ 80之间为老年,这样的多分支语句就需要else-if语句帮忙了。
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("青少年\n");
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 if (age >= 80 && age < 100)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
需要注意的点就是,当我们通过使用if、else-if、else语句的,我们就可以实现真正的多分支结构了。其中if与else语句在一组分支语句当中只能有一个,但是else-if语句可以有多个,最后一个用else结尾。if、else-if、else语句后面的语句项如果只有一个的话可以不加大括号{},一个大括号就是一对代码块。
接着我们来看这么一段代码,判断一下它的输出结果是多少?
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
在这段代码当中运行结果会是什么呢?会是“haha”吗?还是“hehe”?还是什么都不输出呢?我们在VS编译器下面运行一下看看我们的运行结果。
这段代码的运行结果是什么也不输出。那么为什么会是这个样子呢?可能会有小伙伴认为最后的结果会是“haha”,因为我们在最开始的时候给定的a的值是0,在判断部分显然不是a=1啊,所以会直接跳转到后面的else语句块当中。
如果你这么认为那就是细节没有理解,我们要注意,下面else语句没有执行的原因是要遵循一个就近原则,else语句会自动和距离最近的if来进行匹配,因此我们就可以理解不输出的原因了吧!
所以我们在写代码的时候要特别注意格式,最好是这样子写代码:
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
这样子来看代码是不是就清晰明了了呢。因此建议我们小伙伴在写代码的时候做最好是加上大括号{}。
通常情况下,我们书写出来的代码有好有坏。我们要有自己的代码风格,形成一种良好的代码风格会给人带来一种通俗易懂的感觉。代码风格决定了程序的可读性和易懂性。因此,我们在使用if-else语句的时候尤其要注意自己书写的风格,最好以下面两种形式来书写:
//代码风格1
if(condition)
{
return x;
}
else
{
return y;
}
//代码风格2
int n = 3;
if(3 == n)
{
printf("hehe\n");
}
这里要说明一下代码2的风格,之所以把可修改的数值放到表达式的左边,是因为在C语言当中,“==” 表示等于,“=”则表示赋值,我们为了区分这两种表达,所以最好把数值放在左边,如果不小心把“= =”和“=”弄混了,编译器就会直接告诉我们的错误。
//判断一个数字是否为奇数,直接模2即可,代码如下
#include
int main()
{
int n = 0;
scanf("%d", &n);
if(n % 2 == 1)
{
printf("奇数\n");
}
return 0;
}
//第二题的思路,首先产生1~100的数字,然后再判断奇数还是偶数
#include
int main()
{
//打印1~100之间的奇数
int i = 1;
//利用奇数的等差数列的性质进行判断
while (i <= 100)
{
printf("%d ", i);
i=i+2;
}
//直接模2来判断奇数还是偶数
while (i <= 100)
{
//对i进行判断,是奇数才打印
if(i%2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
接下来我们来学习switch分支语句的相关语法。
switch语句块是一种分支语句,经常用于多分支的情况。在多分支语句当中,也就类似于if…else if…else if…else if…else。只不过用起来比这种形式更加简便。
switch语句的语法基础如下所示:
switch(整型表达式)
{
case 1:
语句项;
case 2:
语句项
...
}
switch语句括号内部必须是整型常量表达式,然后进行分支判断,执行整型常量表达式指定的分支语句。但是,单一的switch语句并不可以执行分支结构,需要去搭配一个转向语句break才可以完成真正的分支。break语句真正的作用是终止当前的代码,跳出循环或者判断,switch语句当中,case决定入口,break决定出口。
比如:
#include
int main()
{
int day = 0;
scanf("%d", &day);//3
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
if (1 == day)
printf("星期1\n");
else if (2 == day)
printf("星期2\n");
else if (3 == day)
printf("星期3\n");
...
return 0;
}
上述代码的执行流程为:当我们向程序输入数字1或者2…7的时候,switch语句就会读取数字,并且跳转到相应的case语句当中,执行printf输出打印,然后break跳出当前的分支语句。这样,我们就真正实现了多分支结构。
同样地,当我们的break语句的使用也会根据我们的需求发生变换,比如,需求变化为输入1~5的时候打印“工作日”,输入6、7的时候打印“休息日”,那么我们的代码就变化为:
#include
int main()
{
int day = 0;
scanf("%d", &day);//3
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
这段代码就可以满足需求,当输入1~ 5的时候,case1 ~ 5决定了程序的入口,并且在打印之后“工作日”之后,在break跳出语句。case 6~7也是相同的道理,打印“休息日之后”,break语句决定的分支出口跳出语句。
当我们看到上面的代码的时候,我们要想出一个问题。如果整型表达式的值与所有的case标签都对不上,那么怎么办呢?其实这种情况下运行结果不会停止,也不会报错。如果我们不想忽略不匹配结果的时候,该怎么实现呢?这种情况下,我们可以通过在switch语句后面加上default子句来实现。
#include
int main()
{
int day = 0;
scanf("%d", &day);//3
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
编程好习惯:
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。