一.前言

亲爱的小伙伴们大家好啊!通过初识c语言的三篇文章我们对c语言有了大概的了解,那么从这篇文章开始我们就真正的开始学习c语言了,我们这里会对另一个专栏初识c语言里面的内容进行充分的补充,我们这里会将每一个知识点进行细化,内容更加的丰富,而且在每篇文章里面,我也会帮助大家总结知识点,总结易错点,来帮助大家避避雷,在本篇文章的最后我也会挑一些例题来帮助大家巩固知识点,当然这些例题我也会做出详细的解析,但是不在这个专栏里面,我会放到c语言例题详解这个专栏,好废话不多说我们开始本章的内容

二. 顺序结构

  我们c语言是一个结构化的程序设计语言,一个结构化设计的程序无论程序结构如何复杂,都可以使用3种基本流程控制结构加以表达与陈述。这3种结构分别为:顺序结构、选择结构、循环结构。那我们先来讲讲什么是顺序结构?顺序结构:指程序语句自上而下、一个程序语句接着一个程序语句执行的结构。那我们这句话怎么来理解?我们先来看一张图片:
请添加图片描述
我们这里就是先执行程序语句1,程序语句2执行完了再执行程序语句2,程序语句2执行完了接着执行程序语句3,一个接着一个然后程序运行结束,这么来看的话我们顺序结构就好比一条笔直的道路从头走到尾。那么我们这里的语句又是怎么来理解的呢?语句是C语言最基本的执行单位,每一行语句都必须以分号(;)结束。在C程序中,我们可以使用“{ }”大括号,将多条语句包围起来,这些被包围的语句我们就称之为程序区块或语句区块。我们顺序结构就是这样,非常的普通和普遍可以说我们写的程序都离不开循序结构,那顺序结构就介绍到这。

三.为什么会有分支语句

  我们生活中处处都存在着选择,我们在马路上面开车的时候,绿灯还有3秒就变成黄灯了,我们是选择加快速度闯过去还是减速停车;我们在吃早饭的时候我们是选择吃热干面还是选择吃豆皮;我们在高中分科的时候,我们是选择读文科还是理科,我们生活中处处都存在着选择,但是我们前面的顺序结构通常都无法解决生活中的选着性的问题,我们顺序结构执行的逻辑就是语句1执行完立马执行语句2,语句2执行完立马执行3一个接着一个,那我们把这些不同的选择情况写上去用顺序结构的话,那岂不是所有的情况都得执行,我本来想表示选着文科或者理科,结果用顺序结构直接表示成既要学习理科也要学习文科,我想表示早上吃热干嘛或者豆皮,用顺序结构结果变成了早上热干面和豆皮都要吃,那这里是不是就出现了问题,既然出现了问题那么就有解决问题的方法,所以我们这里就有了分支语句(选择结构),他能够解决程序中的选择问题,能够使得程序的功能更加的复杂,使得程序的逻辑性和灵活性更加的强大,那么接下来我们就要介绍两个语句分别为if语句,switch语句(下一篇文章进行讲解)。

四.if语句

  在if语句中,首先判断表达式的值,然后根据该值的真假情况决定后续流程。表达式的值不等于0,就表示为真;否则,就是假值。if语句有if,if… else,else if 3种形式,那么接下来我们就一个一个的讲解。

五.if语句形式

1.if的基本形式

if语句的基本形式如下:
请添加图片描述
其中,括号中的表达式就是要进行判断的条件,语句则是要执行的对应操作。如果if括号中的表达式为真(非0),那么就执行后面的语句;如果为假(0),则不执行下面的语句,这里我们要注意一点就是当有多条语句的时候,就得用一个大括号将其括起来。我们来看几个例子来理解理解。

2.有关if的例子

第一个例子:
  我们这里可以写一个加法表达式让别人输入这个加法表达式的答案,如果输入的答案正确就自动打印:答案正确答案为xxx,如果答案错误则会打印:答案错误真确的答案为xxx。
  我们看如何用if语句来实现这个情景。首先我们看到这里得有一个加法表达,那我们是不是首先用printf输出函数来告诉使用者这个加法表达式长什么样。

#include<stdio.h>
int main()
{
	printf("请输入:250314+130000+140000的值\n");
	return 0;
}

然后我们让使用者算出这个表达式的结果,输入他算出来的值,然后再判断对错,那么这里我们先创建一个整型的变量叫input_number并且初始化,然后使用scanf函数来储存使用者输入值的值。

#include<stdio.h>
int main()
{
	printf("请输入:250314+130000+140000的值\n");//告诉使用者要计算的表达式
	int input_number = 0;//初始化
	scanf("%d", &input_number);//使用者输入一个值
	return 0;
}

他输入完值之后我们就进入了判断的环节,我们看这个例子:如果算对了就打印计算正确,如果错误就打印计算错误答案是XXX,这里我们可以很明显的发现这里是一个判断的过程,那么我们就可以使用if语句进行判断,并且我们还可以发现这里有两个判断,一个是判断是否正确另一个判断的是否错误,那么我们就可以使用两个if来进行判断,我们的代码实现如下:

#include<stdio.h>
int main()
{
	printf("请输入:2501314+1300000+1400000的值\n");//告诉使用者要计算的表达式
	int input_number = 0;//初始化
	scanf_s("%d", &input_number);//使用者输入一个值
	if (表达式1)//判断答案是否真确
		
	if (表达式2)//判断答案是否错误
		
	return 0;
}

首先我们看这里有两种情况:
一种是输入的答案真确也就是input_number==250314+130000+140000;
另一种就是输入的答案错误:input_number!=250314+130000+140000;
那我们就可以把这两种情况写到表达式里面

#include<stdio.h>
int main()
{
	printf("请输入:2501314+1300000+1400000的值\n");
	//告诉使用者要计算的表达式
	int input_number = 0;//初始化
	scanf_s("%d", &input_number);//使用者输入一个值
	if (input_number==250314+130000+140000)//判断答案是否真确
		语句1
	if (input_number!=250314+130000+140000)//判断答案是否错误
		语句2
	return 0;
}

我们再来看第一种情况,我们将第一种情况放到if语句的后面,如果input_number==250314+130000+140000判断为真的话,就会执行下面的语句,那么我们来看input_number==250314+130000+140000如何为真?那是不是就是我们输入的值input_number确实等于250314+130000+140000这个加法表达式的结果,他就会执行下面的语句,换句话说就是我们输入的值是对的,那么我们这里的语句也就应该写成计算正确答案为:5201314。我们来看表达式2如果input_number!=250314+130000+140000判断为真就会执行下面的语句2,那么我们的表达式2如何判断为真,那是不是就是input_number确实不等于250314+130000+140000这个加法表达式的值,换句话说就是我们输入的值是错的,就会执行下面的语句,那么我们的语句2也就应该写成计算错误答案为:5201314

#include<stdio.h>
int main()
{
	printf("请输入:250314+130000+140000的值\n");//告诉使用者要计算的表达式
	int input_number = 0;//初始化
	scanf("%d", &input_number);//使用者输入一个值
	if (input_number ==( 2501314 + 1300000 + 1400000))
	//判断是否真确
		printf("计算正确答案为:5201314\n");
	if (input_number != (2501314 + 1300000 + 1400000))
	//判断是否错误
		printf("计算错误答案为:5201314\n");
	return 0;
}

好写到这里我们的第一个例子就结束了,那么我们来看看第二个例子。
第二个例子:
  模拟员工打卡的场景,每次打卡需要输入员工的工号和密码,如果工号和密码都输入正确就显示打卡成功,如果有一个输入错误就显示打卡失败这里我们默认工号为520,密码是1314。
  首先我们先得储存这个员工的工号和密码,于是我们就得创建两个整形变量一个是staff用来存储工号,另一个就是password用来存储密码

#include<stdio.h>
int main()
{
	int staff = 520;//初始化
	int password = 1314;//初始化
	return 0;
}

我们存储好了密码和工号我们下一步就要告诉他:让他输入工号和密码进行打卡。这里我们就得用到printf函数,员工输入的时候我们就得用scanf函数来接收,接收的话是不是就又要创建两个新的变量来储存他输入的值,这里我们先输入工号再输入密码,那么我们的代码实现如下

#include<stdio.h>
int main()
{
	int staff = 520;//初始化
	int password = 1314;//初始化
	int staff1 = 0;//初始化
	int password1 = 0;//初始化
	printf("请输入工号->\n");//打印出使用着应该干什么
	scanf("%d", &staff1);//存储使用着输入的工号
	printf("%请输入密码->\n");//打印出使用者应该干什么
	scanf("%d", &password1);//存储使用者输入的密码
	return 0;
}

使用者在输入完之后我们就进入了判断的环节,这里有两个判断的情况:一个是判断是否打卡成功,另外一个就是是否打卡失败,那么我们这里就要列出两个if

#include<stdio.h>
int main()
{
	int staff = 520;//初始化
	int password = 1314;//初始化
	int staff1 = 0;//初始化
	int password1 = 0;//初始化
	printf("请输入工号->\n");//打印出使用着应该干什么
	scanf("%d", &staff1);//存储使用着输入的工号
	printf("%请输入密码->\n");//打印出使用者应该干什么
	scanf("%d", &password1);//存储使用者输入的密码
	if (表达式1)
		语句1
	if (表达式2)
		语句2
	return 0;
}

我们来看两种情况分别是什么:第一个是打卡成功那也就是输入的工号和密码都正确:staff1==staff&&password1==password,第二个是打开失败那也就是输入的工号和密码至少有一个是错误的:staff1!=staff||password1!=password这是我们的两种情况,我们可以将其填入表达式里面

#include<stdio.h>
int main()
{
	int staff = 520;//初始化
	int password = 1314;//初始化
	int staff1 = 0;//初始化
	int password1 = 0;//初始化
	printf("请输入工号->\n");//打印出使用着应该干什么
	scanf("%d", &staff1);//存储使用着输入的工号
	printf("%请输入密码->\n");//打印出使用者应该干什么
	scanf("%d", &password1);//存储使用者输入的密码
	if (staff1==staff&&password1==password)//表达式1
		语句1
	if (staff1!=staff||password1!=password)//表达式2
		语句2
	return 0;
}

我们来看表达式1判断为真就会执行语句1,那我们表达式1如何判断为真呢?是不是就是输入的工号密码都正确,那么我们这里的语句1就应该写成打卡成功,同样的道理表达式2判断为真就会执行语句2,那我们的表达式2如何为真呢?那是不是就是输入的工号和密码至少有一个是错误的,那我们的语句2是不是就应该写成打卡失败。那这里我们就非常的清楚了我们代码也就应该这么写

#include<stdio.h>
int main()
{
	int staff = 520;//初始化
	int password = 1314;//初始化
	int staff1 = 0;//初始化
	int password1 = 0;//初始化
	printf("请输入工号->\n");//打印出使用着应该干什么
	scanf("%d", &staff1);//存储使用着输入的工号
	printf("%请输入密码->\n");//打印出使用者应该干什么
	scanf("%d", &password1);//存储使用者输入的密码
	if (staff1 == staff && password1 == password)//表达式1
		printf("打卡成功\n");
	if (staff1 != staff || password1 != password)//表达式2
		printf("打卡失败\n");
	return 0;
}

写到这里我们的第二个例子也就结束了,想必大家看到这里应该有点感触,我们生活中这样的例子特别多大家可以自己动手试一试。

3.有关if的易错提醒

第一点:
  1.if语句的括号后面一定不能加英文的分号;因为我们之前说了每一行语句都必须以分号(;)来结束,我们if后面的括号没有加分号是因为我们的if语句并没有结束,我们这里的if只是一个判断的过程还有下面的语句的执行的过程所以不能加分号,如果加了分号那么我们这里的if(表达式)就变成了一个空语句,表达式为真也不会执行任何内容。比如说

#include<stdio.h>
int main()
{
	int a = 1;
	if (a == 2);
		printf("hello world\n");
	return 0;
}

我们这里不管a的值等于多少我们都会打印hello world这句话,这是因为我们if后面加了分号,他就管不了下面的printf语句,所以我们这里不管a的值为多少他都会打印hello world。
第二点:
  if语句后面要是有多个语句的话,得加个大括号将这多个语句括起来。这是因为我们的if后面默认跟一个语句,就比如说我们这段代码

#include<stdio.h>
int main()
{
	int a = 1;
	if (a == 2)
		printf("hello\n");
		printf("world\n");
	return 0;
}

我们发现if后面的表达式为假,但是仍然会打印world,这就是因为if在不加大括号的情况下只能管一个语句,所以这里他管不到printf("world\n");这个语句,所以就会出现这样的问题,加大括号表示这是一段整体的语句块,当满足if条件后,语句块里面语句按顺序执行;如果不加大括号,则只会执行if后面的第一句。这里我们为了统一和读代码的方便性我们不管语句的多少都会加个大括号。
第三点:
  我们在判断条件的时候可能会遇到一段区间的情况比如说大于3小于4这种情况,但是大家可千万不要写成3<a<4这样的形式,我们应该写成3<a&&a<4,这是因为编译器在看到3<a<4这种表达式的时候会将其分成两个表达式,他会先判断a是否大于3,如果大于3就返回1,如果不大于3就返回0,然后编译器就会再根据这个返回值来跟4进行比较,所以我们这里就会出现问题,我们来看这段代码

#include<stdio.h>
int main()
{
	int a = 11;
	if (3 < a < 4)
	{
		printf("hello world");
	}
	return 0;
}

这里我们a的值为11,但是if后面的表达式依然会判断为真,并且打印hello world 这个就是我们说的那个原因,所以大家写表达式的时候注意一下不要和数学搞混了。
第四点:
  这里我们看一下下面的代码

#include<stdio.h>
int main()
{
	int a = 0;
	if (a)//表达式1
	{
		printf("hello \n");
	}
	if (a == 0)//表达式2
	{
		printf("world\n");
	}
	return 0;
}

初学者在看到表达式1和2的时候经常将他们搞混淆,会认为他们是一个东西这里我们就说一下,我们的表达式1他的意思的是判断a的值是否为真,而我们的表达式2他的意思是判断的是a==0这个表达式是否成立,这是两个不同的东西哈,我们让a的值为0表达式1里面就是一个a,所以我们这里的a的值就是这个表达式1的结果,所以为假就不会打印hello。我们的表达式2他的内容是a==0,这里是判断这个表达式是否成立,并不是一个单独的值,又因为我们这里的a=0,这个表达式成立为真,所以就会打印world。

六.if…else语句

1.为什么会有if…else语句

  我们上面讲完了if语句大家有没有发现一个问题,我们的if语句似乎只给出了条件为真的时候会执行某个操作,但是并没给出条件为假的时候具体要干什么,如果我们想要表示条件为假时要怎么怎么,我们是不是又得写一个if语句,那是不是就特别的麻烦啊,于是我们就给出了if…else语句这个可以使得在条件为假的时候能够执行另外一段语句。

2.if…else的基本形式

请添加图片描述

  在if后面的括号中判断表达式的结果,如果判断的结果为真值,则执行if后面的语句块内容;如果判断的结果为假值,则执行else后的语句块内容。也就是说,当if语句检验的条件为假时,就执行else后面的语句或者语句块

3.if…else的例子

第一个例子:
  众所周知18岁就已经成年了,所以我们这里写一段程序,使用者输入自己的年龄,如果你的年龄小于18就会自动显示未成年,如果你的年龄大于等于18岁就会自动显示已经成年。
  首先我们看到输入使用者的年龄,那么我们是不是得使用scanf函数来接收使用者的输入的值,并且我们还得创建一个整形变量来存储输入的值那么我们的代码如下:

#include<stdio.h>
int main()
{
	int age = 0;//创建年龄变量
	scanf("%d", &age);//输入自己的年龄
	return 0;
}

我们可以看到这个例子里面有一个判断的过程,如果小于18和如果大于等于18,并且这两个判断的条件时互斥的,那我们是不是很容易根据这两个互斥的条件就想到了if…else语句,而且我们可以填入这两条件中的一个,这里我们就填age<18代码实现如下

#include<stdio.h>
int main()
{
	int age = 0;//创建年龄变量
	scanf("%d", &age);//输入自己的年龄
	if(age<18)
	{
		语句1
	}
	else
	{
		语句2
	}
	return 0;
}

我们再来看这里的语句,如果age<18成立我们就执行语句1,而根据题目的意思我们这里的语句就是打印未成年,如果age<18不成立我们就执行语句2,那我们根据题目的意思就是打印成年人,那我们的代码实现如下:

#include<stdio.h>
int main()
{
	int age = 0;//创建年龄变量
	scanf("%d", &age);//输入自己的年龄
	if(age<18)//表达式
	{
		printf("未成年\n");//表达式为真执行的语句
	}
	else
	{
		printf("已经成年\n");//表达式为假执行的语句
	}
	return 0;
}

第二个例子:
  某公司的薪资结构如下:工龄大于等于5年的工资=基本工资+老员工补贴+生活补贴,而工龄小于5年的工资=基础工资+生活补贴,如果员工一个月打卡超过20次那么这个月就算全勤,工资再加上全勤奖励。我们设计一段代码,该代码能够使得员工输入自己的工龄和打卡次数之后能够自动显示自己这一个月的薪水。假定基本工资1w,生活补贴5千,全勤3千,老员工补贴1w。
  我们首先可以看到,他是要求员工输入自己的工龄和打卡天数那么我们这里是不是很快的就可以想到用scanf函数来接收这两个值,并且得创建两个变量来储存他输入的值,而且我们这里是不是得先打印出来一些语句来提醒使用者该输入一些什么,那我们这里就应该使用printf函数,然后我们还得创建一些变量用来储存基本工资,生活补贴等等这些值代码实现如下:

#include<stdio.h>
int main()
{
	int base = 10000;//基础工资
	int live_allowance = 5000;//生活补贴
	int old_worker = 10000;//老员工补贴
	int full_attendce = 3000;//全勤
	int work_age = 0;//创建整形变量工龄
	int work_day = 0;//创建整形变量工作天数
	printf("请输入你的工龄\n");//告诉使用者输入什么
	scanf("%d", work_age);//输入值,并将值赋值给work_age变量
	printf("请输入这个月的打卡天数\n");//告诉使用者输入什么
	scanf("%d", work_day);//输入值,并将值赋值给work_day变量
	return 0;
}

这里我们的变量都创建完了,接下来我们就来看这个工资如何来发了,我们可以看到这里是有两个互斥的条件一个是:是否工龄大于5年。一个是:是否打卡大于等于20天。那我们这里先写出一个互斥的条件工龄是否大于5年其代码显示如下

#include<stdio.h>
int main()
{
	int base = 10000;//基础工资
	int live_allowance = 5000;//生活补贴
	int old_worker = 10000;//老员工补贴
	int full_attendce = 3000;//全勤
	int work_age = 0;//创建整形变量工龄
	int work_day = 0;//创建整形变量工作天数
	printf("请输入你的工龄\n");//告诉使用者输入什么
	scanf("%d", work_age);//输入值,并将值赋值给work_age变量
	printf("请输入这个月的打卡天数\n");//告诉使用者输入什么
	scanf("%d", work_day);//输入值,并将值赋值给work_day变量
	if (work_age >= 5)//判断是否是老员工
	{
		printf("你是老员工\n");//判断结果为是老员工
	}
	else
	{
		printf("你不是老员工\n");//判断结果为不是老员工
	}
	return 0;
}

这个条件写完但是我们还不能算出这个员工的总工资因为我们还得判断他是否全勤,全勤他也是一个互斥的条件所以我们也得用到if…else语句,但是这里就有一个问题,我们这个语句判断全勤的if…else语句放到哪里,这里无疑就两个地方一个在if和else后面的大括号里面,另外一个就是在if…else语句的下面,但是我们这里的工资发放的制度是层层筛选的机制,先选择一部分,再在这选下来的一部分中再选一部分,不是说选择这一部分,然后再选与之前选择结果无关的另一部分,所以我们的第二个if…else语句得放到括号的里面,大家多想一想应该能看懂,就好比我们经历的高考中考,中考先选择一部分人能够读高中,高考再从之前能读高中的那批人里面,再选择一部分人能读大学是同一个道理。好那么我们的选择写完了,我们的工资发放也就变得非常的清楚,可以直接用printf函数将其打印出来。

#include<stdio.h>
int main()
{
	int base = 10000;//基础工资
	int live_allowance = 5000;//生活补贴
	int old_worker = 10000;//老员工补贴
	int full_attendce = 3000;//全勤
	int work_age = 0;//创建整形变量工龄
	int work_day = 0;//创建整形变量工作天数
	printf("请输入你的工龄\n");//告诉使用者输入什么
	scanf("%d", work_age);//输入值,并将值赋值给work_age变量
	printf("请输入这个月的打卡天数\n");//告诉使用者输入什么
	scanf("%d", work_day);//输入值,并将值赋值给work_day变量
	if (work_age >= 5)//判断是否是老员工
	{
		printf("你是老员工\n");//判断结果为是老员工
		if (work_day >= 20)//判断是否全勤
		{
			printf("你的工资为-》%d", base + live_allowance + 
			old_worker + full_attendce);
		}
		else
		{
			printf("你的工资为-》%d", base + live_allowance + 
			old_worker );
		}
	}
	else
	{
		printf("你不是老员工\n");//判断结果为不是老员工
		if (work_day >= 20)//判断是否全勤
		{
			printf("你的工资为-》%d", base + 
			live_allowance+ full_attendce);
		}
		else
		{
			printf("你的工资为-》%d", base + live_allowance );
		}
	}
	return 0;
}

这里为了大家的阅读方便我们就把一个长语句分成两排。
当然我们这里其实也可以先筛选是否全勤再筛选是否为老员工道理一样我就不再多解释这里我把代码给你们看看,你们下去可以多多尝试。

#include<stdio.h>
int main()
{
	int base = 10000;//基础工资
	int live_allowance = 5000;//生活补贴
	int old_worker = 10000;//老员工补贴
	int full_attendce = 3000;//全勤
	int work_age = 0;//创建整形变量工龄
	int work_day = 0;//创建整形变量工作天数
	printf("请输入你的工龄\n");//告诉使用者输入什么
	scanf("%d", work_age);//输入值,并将值赋值给work_age变量
	printf("请输入这个月的打卡天数\n");//告诉使用者输入什么
	scanf("%d", work_day);//输入值,并将值赋值给work_day变量
	if (work_day >= 20)//判断是否全勤
	{
		if (work_age >= 5)//判断是否是老员工
		{
			printf("你是老员工\n");//判断结果为是老员工
			printf("本月已经全勤\n");
			printf("你的工资为-》%d", base + live_allowance 
			+ old_worker + full_attendce);
		}
		else
		{
			printf("你不是老员工\n");
			printf("本月已经全勤\n");
			printf("你的工资为-》%d", base + live_allowance 
			+ full_attendce);
		}
	}
	else
	{
		if (work_age >= 5)//判断是否是老员工
		{
			printf("你是老员工\n");//判断结果为是老员工
			printf("本月没有全勤\n");
			printf("你的工资为-》%d", base 
			+ live_allowance + old_worker);
		}
		else
		{
			printf("你不是老员工\n");
			printf("本月没有全勤\n");
			printf("你的工资为-》%d", base + live_allowance );
		}
	}
	return 0;
}

4.if…else易错提醒

第一点:
  else必须跟在一个if语句后面,不能独立使用。
第二点:
  多个语句也得使用大括号,跟前面的if语句一样的原理。
第三点:
   else总是和最近的未匹配的if进行配对。这句话什么意思?我们来看一段代码

#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;
}

大家可以自己看一下觉得这个答案是多少呢?是不是很多人都觉得答案因该是haha,但是这里的答案却是什么都没有,那这是什么原因呢?这里就是我们说的else总是和最近的未匹配的if进行配对,那么我们这里的最近的if是谁是第二个if,那么我们这里的else他是和第二个if进行匹配,而第一个if他控制的语句是第二个if,我们把这段代码加个大括号大家就应该能够明白

#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;
}

那么我们这里的a等于0,所以我们的第一个if就直接为判断为假,那么我们大括号里面的语句就直接跳过不会执行所以这里我们什么都不会打印。我们在写if语句的时候都加个大括号,这样我们就有更好的阅读性,减少错误的发生。

七.else if

  利用if和else关键字进行组合,可以实现else if语句。

1.为什么会有else if语句

该语句可以对一系列互斥的条件进行检验,从而解决复杂的判断和决策的问题,简单说就是我们生活中的选择不只两种,可能存在更多的选择情况,和判断的情况,这么多的情况我们的if…else语句是无法解决的,于是就有了else…if语句。

2.else if的基本形式

请添加图片描述
else if语句的执行流程图如图所示。首先对if语句中的表达式1进行判断,如果结果为真值,则执行后面跟着的语句块1,然后跳过else if语句和else语句,如果结果为假,那么判断else if语句中的表达式2,如果表达式2为真值,那么执行语句块2而不会执行后面的else if的判断或者else语句。当所有的判断式都不成立,也就都为假值时,就执行else后面的语句块m。

3.有关else if的例子

第一个例子:
  模拟高考填志愿,使用者输入自己的分数然后电脑会根据你的分数自动显示出建议你填报哪些学校,比如说630分以上建议填报985大学,600分到630建议填报211大学,600分到560分建议填报双一流大学,560分到500分建议填报一本大学,500分以下就建议填报二本大学。
  这里我们首先可以看到就是我们要输入使用者的分数,那么我们这里就要创建一个整形的变量来存储输入的值,并且我们还要使用printf函数来打印出来告诉使用者干嘛

#include<stdio.h>
int main()
{
	printf("请输入你的高考分数-》\n");
	int Test_score = 0;//初始化
	scanf("%d", &Test_score);//存储高考分数
	return 0;
}

使用者输入了自己的分数之后,那么我们是不是就要根据他的分数做出一些判断,我们根据题目的要求,我们发现了他有很多的情况,并且每种情况都有一种对应的表达式,那么我们就可以使用else if语句,他一共有5种情况,那我们就可以根据我们上述的分数区间写出表达式

#include<stdio.h>
int main()
{
	printf("请输入你的高考分数-》\n");
	int Test_score = 0;//初始化
	scanf("%d", &Test_score);//存储高考分数
	if (Test_score >=630)//请况1
	{
		语句块1
	}
	else if (Test_score>=600&& Test_score<630)//情况2
	{
		语句块2
	}
	else if (Test_score>=560&& Test_score<600)//情况3
	{
		语句块3
	}
	else if (Test_score>=500&& Test_score<560)//情况4
	{
		语句块4
	}
	else//情况5
	{
		语句块5
	}
	return 0;
}

最后我们再根据不同的分数段所对应的结果来写出语句块的内容

#include<stdio.h>
int main()
{
	printf("请输入你的高考分数-》\n");
	int Test_score = 0;//初始化
	scanf("%d", &Test_score);//存储高考分数
	if (Test_score >=630)//请款1
	{
		printf("建议报考985大学\n");
	}
	else if (Test_score>=600&& Test_score<630)//情况2
	{
		printf("建议报考211大学\n");
	}
	else if (Test_score>=560&& Test_score<600)//情况3
	{
		printf("建议报考双一流大学\n");
	}
	else if (Test_score>=500&& Test_score<560)//情况4
	{
		printf("建议报考一本大学\n");
	}
	else//情况5
	{
		printf("建议报考二本大学\n");
	}
	return 0;
}

第二个例子:
  这里我们试着设计一个程序实现一个分段函数,并且我们输入x的值他就会自动的返回y的值给我们分段函数长这样:
请添加图片描述
  我们可以看到这个分段函数有三种可能的情况并且每种情况都对应着一个独特的表达式,那么我们这里就可以使用else if语句,我们先创建一个变量x用于储存我们输入的值

#include<stdio.h>
int main()
{
	int x = 0;//初始化
	printf("请输入x的值\n");
	scanf("%d", &x);//存储x的值
	return 0;
}

然后我们就可以使用else if来创建三种不同的情况,并且根据分段函数的三种不同的范围来进行划分

#include<stdio.h>
int main()
{
	int x = 0;//初始化
	printf("请输入x的值\n");
	scanf("%d", &x);//存储x的值
	if (x<1)//情况1 
	{
		语句块1
	}
	else if (1 <= x && x < 10)//情况2 
	{
		语句块2
	}
	else//情况3
	{
		语句块3
	}
	return 0;

题目要求我们自动返回y的值那我们这里的语句块就可以直接用printf函数来返回y的值代码实现如下:

#include<stdio.h>
int main()
{
	int x = 0;//初始化
	printf("请输入x的值\n");
	scanf("%d", &x);//存储x的值
	if (x<1)//情况1 
	{
		printf("y的值为%d\n",x);
	}
	else if (1 <= x && x < 10)//情况2 
	{
		printf("y的值为%d\n",(2*x-1));
	}
	else//情况3
	{
		printf("y的值为%d\n",(3*x-11));
	}
	return 0;

那么这里我们就很快的解决了这一题,其实大家题做多了就发现这里就是照葫芦画瓢很简单的。

4.else if的易错提醒

第一点:
大家就是要注意在写的时候要注意不要在if ,else if,else后面加分号。
第二点:
而且这么多情况中只要有一种判断为真的话,其他的判断条件是不会进行判断的,所以就更不用考虑会执行其他情况的语句。
第三点:
大家不要忘了在判断的最后一种情况写else而不是else if,因为当所有的表达式都判断为假的时候,就会执行else下面的语句,如果你把else去掉,当所有的表达式都判断为假的话,就会直接结束这个else if语句,什么语句块都不会执行。

八.if语句的嵌套使用

  if语句中还可以包含一个或者多个if语句,这种情况称为if语句的嵌套

1.为什么会有if语句的嵌套使用

  因为我们一层if,if…else,else if语句只能做到基本的细化,但是我们的生活的许多事情都没有那么的笼统,没有那么抽象,就比如我们的高考填志愿考虑的情况是十分复杂的,十分细致的,就拿我们上面说的,上了630分就能读所有的985吗?低于500分一定有二本读吗?对吧我们还得进行更多的细分所以这里就出现了if的嵌套使用,来对我们处理的对象进一步细分。

2.嵌套使用的形式

请添加图片描述
使用if语句的嵌套形式,可将判断的条件进行细化,从而实现更加复杂的判断和操作。

3.if语句的嵌套使用的例子

  粽子有甜的,有咸的。甜粽子有5元的和10元的。先粽子有4元的和12元的。编写程序,根据输入的口味和钱数,判断并且打印出能吃到的哪种粽子。其中,输入1代表选择甜粽子,其他数字代表选择咸粽子。根据使用者输入的值来自动判断可以吃到怎么样的粽子。
  我们可以看到使用者得输入两个数字一个自己可以使用的金额,另一个就是选择粽子的种类,那么我们先创建两个变量一个是用于储存输入着的金额,另外一个就是储存输入者的选择类型,并且我们还得告诉使用者一些基本的使用信息那我们的代码如下:

#include <stdio.h>
int main()
{
	int type = 0;
	int money = 0;
	printf("数字1表示甜粽子,其他数字表示咸粽子\n");//显示基本的信息
	printf("请输入粽子的口味\n");//显示基本的信息
	scanf("%d", &type);//存储选择的类型
	printf("请输入可以支付的金额\n");
	scanf("%d", &type);//存储可使用的金额
	return 0;
}

由于这里有两种不同口味的粽子,而且不同口味的粽子存在着不同的价格,那么我们这里是不是可以先将这里先分成两个大类,一个是甜粽子的类型,一个是咸粽子的类型,又因为甜粽子和咸粽子又有三种不同的类型那么我们这里if…else语句里面是不是又得嵌套两个else if语句其代码实现如下:

#include <stdio.h>
int main()
{
	int type = 0;
	int money = 0;
	printf("数字1表示甜粽子,其他数字表示咸粽子\n");//显示基本的信息
	printf("请输入粽子的口味\n");//显示基本的信息
	scanf("%d", &type);//存储选择的类型
	printf("请输入可以支付的金额\n");
	scanf("%d", &type);//存储可使用的金额
	if (type == 1)//选择甜粽子	
	{
		if (money>=5&&money<10)//选择5元的粽子
		{
			语句块1
		}
		else if(money>=10)//选择10元的粽子
		{
			语句块2
		}
		else//无法吃到粽子
		{
			语句块3
		}
	}
	else//选择咸粽子
	{
		if (money >= 4 && money < 12)//选择4元的粽子
		{
			语句块4
		}
		else if (money >= 12)//选择12元的粽子
		{
			语句块5
		}
		else//吃不到粽子
		{
			语句块6
		}
	}
	return 0;

那么我们这里是不是就可以再结合题目给出来的条件将语句块填进去那么代码实现如下:

#include <stdio.h>
int main()
{
	int type = 0;
	int money = 0;
	printf("数字1表示甜粽子,其他数字表示咸粽子\n");//显示基本的信息
	printf("请输入粽子的口味\n");//显示基本的信息
	scanf("%d", &type);//存储选择的类型
	printf("请输入可以支付的金额\n");
	scanf("%d", &type);//存储可使用的金额
	if (type == 1)//选择甜粽子
	{
		if (money>=5&&money<10)//选择5元的粽子
		{
			printf("您可以吃到5元的甜粽子/n");
		}
		else if(money>=10)//选择10元的粽子
		{
			printf("您可以吃到10元的甜粽子/n");
		}
		else//无法吃到粽子
		{
			printf("无法购买粽子/n");
		}
	}
	else//选择咸粽子
	{
		if (money >= 4 && money < 12)//选择4元的粽子
		{
			printf("您可以吃到4元的咸粽子/n");
		}
		else if (money >= 12)//选择12元的粽子
		{
			printf("您可以吃到12元的甜粽子/n");
		}
		else//吃不到粽子
		{
			printf("您无法购买粽子/n");
		}
	}
	return 0;
}

4.易错提醒

if 语句,if…else语句,else if语句可以根据需要互相嵌套,在复杂的嵌套过程中,一定要注意if与else的配对情况。else总是与其前面最近未配对的if进行配对。

九.if语句的书写

第一点:
这里我们先来看一段代码

if (condition) {
	return x;
}
return y;

大家来看一些这段代码是什么意思,是不是感觉这个代码很难看,有点模模糊糊的感觉,这里就是if的书写所带来的问题,这个写法很不规范以至于给我们的阅读带来了一定的影响,但是他是对的,那我们把这个代码改一下让其更好理解一点,大家看一下能否看的出来这是什么意思

if (condition)
{
	return x;
}
else
{
	return y;
}

这么一看是不是感觉明了很多,上面的代码的意思就是如果条件成立就返回x,如果条件不成立就返回y,但是我们第一种写法就有点不好看出来,而我们第二种写法却一下子就看出来了,这就是我们书写的重要性,所以我们if后面尽量都加大括号来保证阅读的舒适性。
第二点:
第二种就是我们平时在a==3这种表达式的时候很容易漏掉一个=号而造成了程序运行错误但是编译器他不会报错,那么这里我们可以改一下我们将a==3改成3==a,这样的话我们就算漏掉一个等于号也不要紧,因为编译器会报错压根就编译不过去,这样也可以提醒程序员这里存在问题,那么我们这里为什么就会报错呢?是因为我们左边是一个常量右边是一个变量,==情况下这里是判断两个值是否相等,而如果是=的情况这里就变成了赋值,但是我们的3是一个常量,常量的值是不能改变的所以这里就会报错。所以在判断是否相等的时候,如果两边一边为变量,一边为常量的时候,最好将常量放在左边,变量放到右边。如果两边一边是常量一边是表达式的话就不能这么做因为表达式是不能赋值的,比如num%2=1这本来就是错的编译器可以检测出来。

总结

我们这篇文章就这么结束了,通过这篇文章我们了解了if的3种形式,并且还列出来其易错的地方,在文章的后面我们举例写出了糟糕的书写会带来理解上的错误,那么看到这里大家应该能对if语句有了一定的了解,那么点开我的主页进入刷题专栏去练习一下吧。我们的分支语句还有switch语句这个我们下一篇文章 进行讲解,谢谢大家阅读。

这里为了方便大家学习这文章的所有例子的代码点击这个链接获取
点击这里查看本文章所有例子代码
大家在这里面找到源.c文件即可路径为分支语句–分支语句–源.c。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐