草庐IT

『C语言从入门到进阶』第 ① 期 - 分支语句

花想云(西安第一深情) 2023-04-19 原文



文章目录

💐专栏导读

🌸作者简介:花想云,在读本科生一枚,致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C语言初阶专栏,本专栏主要内容为C语言的初阶知识的全套讲解,包含初识C语言、函数、数组、分支与循环、操作符、指针初阶的讲解。

🌸相关专栏推荐:C语言进阶系列 数据结构与算法

💐文章导读

本篇文章主要内容为学习C语言中的分支语句——if语句与switch语句。介绍了什么是语句、if语句的语法结构、悬空else、switch的语法结构等。

🌷什么是语句

C语言中,一条指令、一行代码都可以称为语句,每条语句是以分号;来进行分隔的。

语句可分为以下五类:

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句

本章将要学习的分支语句属于控制语句的一种。控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句switch语句

  2. 循环执行语句:do while语句while语句for语句

  3. 转向语句:break语句goto语句continue语句return语句

🌷什么是分支语句

分支源于选择。正因为有多种不同的选择,才会产生不同选择所造成的结果。

如果你好好学习,毕业年薪百万,走上人生巅峰;如果你不学习,毕业等于失业,回家卖红薯。

是否好好学习就是选择,年薪百万与回家卖红薯就是不同的分支。

C语言中,我们经常使用if语句switch语句实现选择与分支。

🌷if语句

🌺语法结构

//语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
  • if后面的()中的表达式为条件判断的表达式,若表达式为真,则执行语句;若表达式为假则不执行;
  • C语言中,0表示假非0表示真

用法示例

int main()
{
	int a = 1;
	if (a == 1)
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
	return 0;
}

🌺else if

如果我们需要实现很多选择的情况,可以利用else if来实现,意为否则。

int main()
{
	int a = 1;
	if (a == 1)
	{
		printf("a=1");
	}
	else if(a>1)
	{
		printf("a>1");
	}
	else//对应a<1的情况
	{
		printf("a<1");
	}
	return 0;
}

🌺悬空else

初学者经常会犯的错误就是悬空else,也是学校测试喜欢考察的内容,例如,这就是一道非常经典的悬空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相匹配。第一个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;
}

当我们不注重代码的书写规范时,我们难免会出现这样的bug,而且这种bug往往是最难发现的,编译器并不知道我们的代码想要表达的意思,它只要觉得代码符合语法规范就不会报错。而且就算是我们肉眼寻找也极难发现,当然我们也有很好的办法来避免它,那就是,不要偷懒,多使用{}

🌷switch语句

switch语句同样也是一种分支语句,它能应对比if语句更复杂的场景。

🌺语法结构

直接来看示例:

int main()
{
	int a = 1;
	switch (a)
	{
	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;
	default:
		printf("周末\n");
		break;
	}
	return 0;
}

如上所示,switch语句,经常由switchcasebreakdefaul构成。

  • switch:switch后面的()中的内容为一个整型表达式
  • case:case意为情况,case后面的值为整型表达式的可能取值;如果表达式的值为这个可能取值,则执行:后面的语句。
  • break:当我们执行完一种情况,而不想在继续往下执行,我们就需要用break来跳出switch。
  • default:意为否则,作用是,若上述的case不符合可能取值,则执行default的语句。

灵活的运用breakdefault可以应对很多不同的场景。例如:

int main()
{
	int a = 1;
	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	default:
		printf("周末\n");
		break;
	}
	return 0;
}

注意

  • 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
  • 每个 switch 语句中只能出现一条default子句
  • 可以写在任何一个 case 标签可以出现的位置,不一定是末尾。


点击下方个人名片,可添加博主的个人QQ,交流会更方便哦~
*** ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓***

有关『C语言从入门到进阶』第 ① 期 - 分支语句的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  8. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  9. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  10. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl

随机推荐