【C语言初阶(1)】分支语句

前言

  • C语言是一门结构化的程序设计语言;
  • 它分为:顺序结构、选择结构、循环结构。

顺序结构

  • [X]从头走到尾,一条道走到黑,中间没有进行选择之类的拐弯抹角。

选择结构

  • 分支语句也叫做选择语句
  • 生活中处处充满了选择,如果(if)你好好学习,等毕业了就能拿一个好 offer,否则(else)就回家卖番薯,这就是选择!

循环结构

  • 生活中可能需要把一件事反复的去做,这种情况就称之为循环。

在这里插入图片描述

总结

  • 生活中的所有事情都可以抽象成这三种结构的某一种,或者这三种结构的组合来描述清楚生活中所有的事情。
  • C语言中就提供了能够描述这几种结构的能力:
    • 顺序结构:实在没啥好说的,就一条道走到黑就完了;
    • 选择结构:if、switch 语句;
    • 循环结构:for、while、do while 语句。

1. if 语句

1.1 if 语法结构

单分支结构

if(表达式)
{
    语句;//若表达式结果如果为真,则执行语句内容,反之不执行
}
if(表达式)//若表达式结果为真,则执行语句 1,反之执行语句 2
{
    语句1;
}    
else
{
    语句2;
}    

在这里插入图片描述

多分支结构

if(表达式1)
{
    语句1;
}
else if(表达式2)
{
    语句2;
}
else
{
    语句3;
}    
  • 有的时候需要做的选择可能不止两种;
  • 假设有 3 4 5 …更多种选项,简单的 if else 就不能够满足了,此时就需要使用到多分支。
  • 注:当只有一条语句时,可以不用大括号。
#include <stdio.h>
//当有多个选择时,就要加上 else if 来实现多分支结构
int main()
{
	int age;
	scanf("%d", &age);

	if (age < 18)
		printf("青少年\n");
		
	else if (18 <= age && age < 28)
		printf("青年\n");
	
	else if (age >= 28 && age < 40)
		printf("壮年\n");
		
	else if (age >= 40 && age < 60)
		printf("中年\n");
		
	else if (age >= 60 && age <= 100)
		printf("老年\n");
		
	else
		printf("老寿星\n");

	return 0;
}

正确使用大括号

  • 条件成立时,如果有多条语句,就必须要用大括号将语句内容框柱。
#include <stdio.h>

int main()
{
	int age;
	scanf("%d", &age);

	if (age < 18)
		printf("青少年\n");//只有这一条语句,可以不用加大括号
		
	else if (18 <= age && age < 28)
	{
		//条件成立时,如果有多条语句时,就必须要用大括号将语句内容框柱
		printf("青年\n");
		printf("不香翅捞饭就遵纪守法")
	}	
	
	return 0;
}
  • 这里的一对 { } 就是一个代码块。

1.2 悬空 else

else的匹配

  • else 是和它离的最近的 if 匹配的。

举个栗子

  • 下列代码的结果是什么?
#include <stdio.h>

int main()
{
	int a = 0, b = 2;

	if (a == 1)
		if (b == 2)
			printf("hehe\n");
	else
		printf("haha\n");

	return 0;
}

啥也不会发生
在这里插入图片描述

  • 之前也说过,else 只会和离它最近的 if 进行匹配,当我们把这段代码拷进 VS 底下时 else 的位置其实是这样的:

在这里插入图片描述

改进

  • 适当的使用 { } 可以使代码的逻辑更加清楚。
  • 代码风格很重要,写出漂亮的代码不仅仅只是为了方便阅读,同时也能有效的减少 BUG 的产生。
#include <stdio.h>
//改成这样就能更好的进行阅读了
int main()
{
	int a = 0,b=2;

	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

1.3 “ = ” 号引发的错误

  • 在C语言中,如果只有一个 = 号是赋值的意思,有两个 == 号才是判断是否相等;
  • 如果在 if 语句的表达式中,不小心采用的是赋值符号,则表达式结果永远为真,并且这种情况编译器还不会报错;

在这里插入图片描述

  • 解决方法:判断变量和某个数是否相等时,应该将变量置于表达式的右边,这样就不需要担心会一不小心少敲一个 = 了;
    • 因为在 C 语言中,是绝对不会允许给一个常量赋一个变量的。

在这里插入图片描述

在这里插入图片描述

1.4 if 语句练习题

1. 判断一个数是否为奇数

  • 用这个数模上一个 2,余数为 1 的是奇数。
#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);

	//奇数除于的余数为1
	if (1 == num % 2)
	{
		printf("%d 是奇数\n",num);
	}
	else
	{
		printf("%d 不是奇数\n", num);
	}

	return 0;
}

输出1-100之间的奇数

  • 找出 1-100 中所有 % 2 的结果为 1 的数。
#include <stdio.h>

int main()
{
	int num = 1;

	while (num <= 100)
	{
		if (1 == num % 2)
		{
			printf("%d ", num);
		}
		num++;
	}
	printf("\n");
}

2. switch 语句

  • switch语句也是一种分支语句,常常用于多分支的情况。

举个栗子

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
  • 这种情况下,写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。
  • 这就是 switch 语句。

2.1 switch 语法结构

switch(整型表达式)
{
    语句项;
}

语句项

  • switch 语句的语句项是一些 case 语句
case 整形常量表达式:
    语句;

举个栗子

#include <stdio.h>

int main()
{
	int day;
	scanf("%d", &day);

	switch (day) //根据day的值来判断
	{
	case 1:printf("星期一\n");//day的值是1的话执行这条语句,下同理
	case 2:printf("星期二\n");
	case 3:printf("星期三\n");
	case 4:printf("星期四\n");
	case 5:printf("星期五\n");
	case 6:printf("星期六\n");
	case 7:printf("星期天\n");

	}

	return 0;
}

在这里插入图片描述

  • 这和俺们想要得到的结果貌似不太一样啊;
  • switch 语句中得 case 只是决定了入口,但没说哪里是出口,没有出口只好把 switch 语句的中得内容全部执行完一遍才能结束了;
  • 此时就需用到 break 来决定 switch 语句的出口在哪了。

2.2 在switch语句中的 break

  • 在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。

举个栗子

#include <stdio.h>
int main()
{
	int day;
	scanf("%d", &day);

	switch (day) //根据day的值来判断
	{
	case 1:printf("星期一\n"); break;
		//当 day 的值是1时打印星期一,然后结束整个switch语句,下同理
	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. 输入1-5,输出的是“weekday”;
  2. 输入6-7,输出“weekend”
#include <stdio.h>
//使用break来决定分支
int main()
{
	int day ;
	scanf("%d", &day);

	switch (day)
	{
	case 1://case 后面不加 break 的话是会照顺序往后走的
	case 2:
	case 3:
	case 4:
	case 5:printf("weekday\n");break;
	case 6:
	case 7:printf("weekend\n");break;
	}
	return 0;
}
  • break 语句的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

  • 在最后一个 case 语句的后面加上一条 break语句。
    • 之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

2.3 default 子句

  • 如果表达的值与所有的case标签的值都不匹配怎么办?
    • 在上述代码中,如果有人输入了个 8、10、500 怎么办?
    • 此时就需要使用 default 子句来提示输入错误了。

default

  • 输入的所有不能与 case 匹配的值都走到 default 这来。
  • 所以,每个 switch 语句中只能出现一条 default 子句。

在这里插入图片描述

2.4 switch 语句练习题

  • 下面代码的结果是什么?
#include <stdio.h>

int main()
{
	int n = 1,m=2;

	switch (n)
	{
	case 1:m++;
	case 2:n++;
	case 3:
		switch (n)//switch允许嵌套使用
		{
		case 1:n++;
		case 2:m++;n++;break;
		}
	case 4:m++;break;

	default:break;
	}
	printf("m = %d, n = %d\n", m, n);
	
	return 0;
}
  • 答案是 m = 5,n = 3

题目解析

#include <stdio.h>

int main()
{
	int n = 1,m=2;

	switch (n)//n = 1,执行 case 1 的内容
	{
	case 1:m++;//m = 3,没有 break 继续往下执行
	case 2:n++;//n = 2,没有 break 继续往下执行
	case 3:
		switch (n)//n = 2,执行 case 2 的内容
		{
		case 1:n++;
		case 2:m++;n++;break;//m = 4,n = 3
		//有 break,跳出这个 case 2 所在的 switch语句
		}
	case 4:m++;break;//m = 5,有 break 跳出这个 switch

	default:break;
	}
	printf("m = %d, n = %d\n", m, n);//m = 5,n = 3
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值