C语言——分支语句(条件判断语句)

本文详细介绍了C语言中的语句类型,包括空语句、表达式语句、函数调用语句、复合语句和控制语句,重点讲解了分支语句(if和switch)、嵌套if、else的使用和悬空else问题。还讨论了switch语句的特点,包括break的重要性,以及case和default的顺序灵活性。
摘要由CSDN通过智能技术生成


在介绍 分支语句之前,我们来看看什么是 语句语句的类型

一.语句和语句分类

1.空语句

 空语句最简单,一个分号就是一条语句,即为空语句。

#include<stdio.h>
int main()
{
	;//空语句
	return 0;
}

空语句使用情况:这里需要一条语句,但是这个语句不需要做任何事情,就可以使用空语句。

2.表达式语句

 在表达式的后面加上一个分号,即为表达式语句。

#include<stdio.h>
int main()
{
	int a=10;
	int b=0;
	b=a+10;//表达式语句
	return 0;
}

3.函数调用语句

 在调用函数的时候,也会加上分号,即为函数调用语句。

#include<stdio.h>
int Add(int x,int y)
{
	return x+y;
}
int main()
{
	int a=10;
	int b=20;
	printf("hehe\n");//函数调用语句
	int c=Add(a,b);//函数调用语句
	return 0;
}

4.复合语句

 成对括号中的代码就构成⼀个代码块,即为复合语句。

#include <stdio.h>
void print(int arr[],int sz)//函数的大括号中的代码也构成一个复合语句
{
	int i=0;
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
 	int i = 0;
 	int arr[10] = {0};
 	for(i=0; i<10; i++) //for循环的循环体:大括号中的所有语句,构成一个复合语句
 	{
		 arr[i] = 10-i;
 		 printf("%d\n", arr[i]);
 	}
 	return 0;

5.控制语句

 控制语句用于控制程序的执行流程,用于实现程序中的各种结构方式(C语言支持三中结构:顺序结构选择结构循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:

5.1 分支语句(条件判断语句)

if语句switch语句

5.2 循环语句

for语句,while语句,do while语句。

5.3 转向语句

break语句,continue语句,goto语句,return语句。

这期先讲分支语句,下一期再讲循环语句以及转向语句

二.分支语句

1. if 语句

1.1 if

  if语句的语法如下:

if(表达式)
	语句

  表达式成立(为真),则语句执行。表达式不成立(为假),则语句不执行。在C语言中,0为假,非0为真,也就是表达式结果为0,则语句不执行,表达式结果不为0,则语句执行。

例子:输入一个整数,判断是否为奇数。

include<stdio.h>
int main()
{
	int num=0;
	scanf("%d",&num);
	if(num%2==1)
		printf("%d是奇数\n",num);
	return 0;
}

在这里插入图片描述

1.2 else

  如果判断一个正整数,它不是奇数,那就是偶数了,那么该如何表示呢?这里就需要 if…else… 语句了,语法形式如下:

if(表达式)
	语句1
else
	语句2

例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。

#include <stdio.h>

int main()
{
 	int num = 0;
 	scanf("%d", &num);
	if(num % 2 == 1)
 		printf("%d 是奇数\n", num);
 	else
 		printf("%d 是偶数\n", num);
 return 0;
}

1.3 分支中包含多条语句

  默认在 if 和 else 语句中默认都只控制⼀条语句,⽐如:

#include <stdio.h>
int main()
{
 	int age = 0;
 	scanf("%d", &age);
 	if(age >= 18)
	 	printf("成年了\n");
	 	printf("可以谈恋爱了\n");
 	return 0;
}

  上⾯的代码,你会发现输⼊的值不管是>=18还是<=18,屏幕上都会打印"可以谈恋爱了"
在这里插入图片描述
在这里插入图片描述

  这是因为 if 语句只能控制一条语句,若 if 语句为真,执行 printf(“成年了\n”); 打印"成年了",若 if 语句为假,不会执行 printf(“成年了\n”); 不打印。对于 printf(“可以谈恋爱了\n”); 是独立存在的,不管 if 语句条件的真假,都会被执行。那么我们要 if 语句同时控制2条语句,该怎么办呢?那就要用{}将代码括起来, else 后也可以跟上{}。如下:

#include <stdio.h>

int main()
{
 	int age = 0;
 	scanf("%d", &age);
 	if(age >= 18) //if 后使用{} 控制多条语句。这个块也叫:程序块,或者复合语句
	{
 		printf("成年了\n");
 		printf("可以谈恋爱了\n");
 	}
	else //else 后使⽤{} 控制多条语句。这个块也叫:程序块,或者复合语句 
 	{
 		printf("未成年\n");
 		printf("不可以早恋哦\n");
 	}
 	return 0;
}

4.1 嵌套 if

  在 if else 语句中,if 可以与另一个 if 语句连用,else 也可以与另一个 if 语句连用,构成多重判断,叫 if 的嵌套。

例子:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。

#include <stdio.h>
int main()
{
 	int num = 0;
	scanf("%d", &num);
 	if(num == 0)//先判断num是否为0
 		printf("输⼊的数字是0\n");
 	else
 	{
 		if(num > 0) //若num不为0,在判断num是否大于0
 			printf("输⼊的数字是正数\n");
 		else//若num不为0 且 num不大于0 则执行else 中的语句
 			printf("输⼊的数字是负数\n");
 	}
	return 0;
}
#include <stdio.h>

int main()
{
 	int num = 0;
 	scanf("%d", &num);
 	if(num == 0)
 		printf("输⼊的数字是0\n");
 	else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构 
 		printf("输⼊的数字是正数\n");
 	else
		printf("输⼊的数字是负数\n");
 	return 0;
}

  上面的两种代码本质上是一样的,只能执行一条 printf 语句,若满足条件,则后面的 printf 语句不会执行,遵循先来后到的原则,对于这种多分支语句我个人推荐第二种。

5.1 悬空 else 问题

   如果有多个 if 和 else ,可以记住这样⼀条规则,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;
}

   那么程序运⾏的结果是啥?很多初学者,上来以判断 a是否等于1,不等于1,那就执⾏ else ⼦句,打印 haha 但是当你去运⾏代码,输出的结果是:啥都不输出。
在这里插入图片描述
   为什么呢?这就是悬空 else 的问题,如果有多个 if 和 else 并且没有{},可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。上⾯的代码排版, 看似else 和第⼀个 if 语句对⻬让我们以为 else 是和第⼀个if匹配的,当 if 语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印

   如果代码改成下⾯这样就更加容易理解了。

#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 匹配,可以这样修改代码:

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

  只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。

2. switch 语句

2.1 if 语句和 switch 语句的对比

  练习:输⼊任意⼀个整数值,计算除3之后的余数。

  如果使⽤ if 语句完成,如下:

#include <stdio.h>

int main()
{
 	int n = 0;
 	scanf("%d", &n);
 	if(n%3 == 0)
 		printf("整除,余数为0\n");
 	else if(n%3 == 1)
 		printf("余数是1\n");
 	else
 		printf("余数是2\n");
	return 0;
}

  如果使⽤ switch 语句改写,就可以是这样的:

#include <stdio.h>
int main()
{
 	int n = 0;
 	scanf("%d", &n);
 	switch(n%3)
 	{
 	case 0:
 		printf("整除,余数为0\n"); 
 		break;
 	case 1:
 		printf("余数是1\n"); 
		break;
 	case 2:
 		printf("余数是2\n"); 
 		break;
 	default:
 	    break;
 	}
 	return 0;
}

  对于多分支语句选择 if 语句,还是 switch 语句,仁者见仁智者见智。

  switch 语句中,我们要注意的点有

  • case 和后边的数字之间必须有空格。
  • 每⼀个 case 语句中的代码执⾏完成后,需要加上 break,才能跳出这个 switch 语句。
  • switch() 内必须是整形表达式。
  • case 后面的值必须是整形常量表达式,可以是字符,因为字符本质是ASCII码值,为整数。
  • default可以放在 case 之前,不过我们通常是把 default ⼦句放在最后处理的。

2.2 switch 语句中的 break

  前⾯的代码中,如果我们去掉 case 语句中的 break,会出现什么情况呢?

#include <stdio.h>

int main()
{
 	int n = 0;
 	scanf("%d", &n);
 	switch(n%3)
 	{
 	case 0:
 		printf("整除,余数为0\n"); 
 	case 1:
 		printf("余数是1\n"); 
 	case 2:
 		printf("余数是2\n"); 
}
 	return 0;
}

在这里插入图片描述
  我们发现,3除以3本来余数是0,但是我们发现程序运⾏的结果多了⼀⾏“余数是1”和“余数是2”的打印。这是为什么呢?
  原因是 : switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 1 和case 2 中的语句。所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。当然,break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

2.3 switch 语句中的 default

  在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。

switch (expression)
{
case value1: statement
case value2: statement
default: statement
}

  switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default ⼦句。
  例如:打印星期的练习,如果 day 的输⼊不是1~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;
 	default:
 		printf("输入错误\n");
 		break;
}
 	return 0;
}

在这里插入图片描述

2.4 switch 语句中的 case 和 default 的顺序问题

  在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。

  • 未完待续~~
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值