C语言系统化精讲(四): 条件判断语句

news2024/10/5 5:14:49

文章目录

  • 一、if语句
  • 二、if…else语句
  • 三、else if语句
  • 四、if语句的嵌套
  • 五、条件运算符
  • 六、switch语句的基本形式
  • 七、多路开关模式的switch语句
  • 八、if…else语句和switch语句的区别

当我们是儿童时,父母就告诉我们记住这句 红灯停,绿灯行,黄灯等待,代表的含义是交通灯的状态,当交通灯是红色时,表示要停止,当为绿灯时,表示可以行走,当为黄灯时,需要等待。接下来用代码来模拟此时交通灯的状况,具体代码如下图所示:
在这里插入图片描述
从代码中可以看到,有紫色的 if 语句,蓝色的 else if 语句以及红色的 else 语句都是陌生的词汇,那么本文就为大家一一解释它们是什么意思。if 语句:即条件判断 if 语句。if 括号中的条件表达式结果为 ,就执行 if 下面大括号内语句。else if 语句:即条件判断 else if 语句。else if 括号中的条件表达式结果为 ,就执行 else if 下面大括号内的语句。else 语句:即条件判断 else 语句。当 ifelse if 语句的条件表达式结果都为 ,就执行 else 下面大括号的语句。以上只是简单的介绍了这三种条件判断语句的功能,接下来详细介绍条件控制语句。

一、if语句

if 语句通过对表达式进行判断,根据判断的结果决定是否进行相应的操作。例如下图所示,买彩票,如果中奖了,就买小汽车。
在这里插入图片描述
中奖的流程图如下图所示:
在这里插入图片描述
if 语句的一般形式为:

if(表达式)
语句;

if 语句的执行流程图如下图所示:
在这里插入图片描述
例如,下面的这行代码:

if(iNum)
//代码中判断变量iNum的值,如果变量iNum为真值,则执行后面的输入语句;如果变量的值为假,则不执行后面的输入语句
printf("这是真值");

在 if 语句的括号中,不仅可以判断一个变量的值是否为真,也可以判断表达式的结果是否为真,例如:

if(iSignal==1)
//判断变量iSignal==1的表达式,如果条件成立,那么判断的结果是真值,则执行后面的输出语句
//如果条件不成立,那么结果为假值,则不执行后面的输出语句
printf("当前信号灯的状态是:%d:",iSignal);

从上面这两行代码中可以看到 if 后面的执行部分只是调用了一条语句,如果是两条语句时怎么办呢?这时可以使用大括号将执行部分括住使之成为语句块,例如:

if (iSignal == 1) {
    printf("当前信号灯的状态是:%d:\n", iSignal);
    printf("车需要停止");
}

将执行的语句都放在大括号中,这样当 if 语句判断条件为真时,就可以全部执行。使用这种方式的好处是可以更规范、清楚地表达出 if 语句所包含语句的范围,所以建议大家使用 if 语句时都使用大括号将执行语句包括在内。

二、if…else语句

除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码。这在C语言中是利用 else 语句来完成的,例如:买彩票,如果中奖了,那就买轿车,否则就买自行车,如下图所示:
在这里插入图片描述
所对应的流程图如下图所示:
在这里插入图片描述
if…else 语句的一般形式为:

if(表达式){
   语句块1;
}else{
   语句块2;
}

if…else 语句的执行流程图如下图所示:
在这里插入图片描述
在 if 后的括号中判断表达式的结果,如果判断的结果为真值,则执行紧跟 if 后的语句块中的内容;如果判断的结果为假值,则执行 else 语句后的语句块内容。例如:

if (value) {
	printf("这个值为真");
} else {
	printf("这个值为假");
}

在上面的代码中,如果 if 判断变量 value 的值为真,则执行 if 后面的语句块进行输出。如果 if 判断的结果为假值,则执行 else 下面的语句块。

注意: 一个 else 语句必须跟在一个 if 语句的后面。

三、else if语句

利用 if 和 else 关键字的组合可以实现 else if 语句,这是对一系列互斥的条件进行检验。比如,某4S店进行大转轮抽奖活动,根据中奖的金额来获得不同类型的车,中奖的金额段之间是互斥的,每次抽奖结果都只能出现一个金额段,如下图所示:
在这里插入图片描述
要实现这个抽奖过程,就可以使用 else if 语句来实现。对应的流程图如下图所示:
在这里插入图片描述
else if 语句的一般形式如下:

if(表达式1){
    语句1;
  }else if(表达式2){
    语句2;
  }else if(表达式3){
    语句3;
  }else if(表达式m){
    语句m;
  }else{
    语句n;
  }

else if 语句的执行流程图如下图所示:
在这里插入图片描述
根据流程图可知,首先对 if 语句中的表达式1进行判断,如果结果为真值,则执行后面跟着的语句1,然后跳过 else if 语句和 else 语句;如果结果为假,那么判断 else if 语句中的表达式2。如果表达式2为真值,那么执行语句2而不会执行后面 else if 的判断或者 else 语句。当所有的判断都不成立,也就是都为假值时,执行 else 后的语句块。例如:

if(iSelection==1)
    {}
else if(iSelection==2)
    {}
else if(iSelection==3)
    {}
else
    {}

上述代码的含义是:

  1. 使用 if 语句判断变量 iSelection 的值是否为1,如果为1则执行后面语句块中的内容,然后跳过后面的 else if 语句判断和 else 语句的执行。
  2. 如果 iSelection 的值不为1,那么 else if 语句判断 iSelection 的值是否为2,如果值为2,则条件为真,执行后面紧跟着的语句块,执行完后跳过后面 else if 语句和 else 语句的操作。
  3. 如果 iSelection 的值也不为2,那么接下来的 else if 语句判断 iSelection 是否等于数值3,如果等于3,则执行后面语句块中的内容,否则执行 else 语句块中的内容。也就是说,当前面所有的判断都不成立(为假值)时,执行 else 语句块中的内容。

四、if语句的嵌套

嵌套可以理解为镶嵌、套用,例如我们熟悉的俄罗斯套娃,一层套着一层,这种做法叫做嵌套。那么,if 嵌套就是在 if 语句中可以包含一个或多个 if 语句。一般形式如下:

if(表达式1){
   if(表达式2){
     语句块1;
   }else{
     语句块2;
   }
} else{
  if(表达式3){
    语句块3;
  }
}

使用 if 语句嵌套的功能是对判断的条件进行细化,然后进行相应的操作。举例: 人们在生活中,每天早上醒来的时候想一下今天是星期几,如果是周末就是休息日,如果不是周末就要上班;同时,休息日可能是星期六或者是星期日,星期六就和朋友去逛街,星期日就陪家人在家。具体代码如下:

#include<stdio.h>

int main() {

  int iDay;    //定义变量表示输入的星期几
  //定义变量代表一周中的每一天
  int Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4,
      Friday = 5, Saturday = 6, Sunday = 7;
  printf("请选择星期几:\n");               //提示信息
  scanf("%d", &iDay);                       //输入星期
  if (iDay > Friday)                        //休息日的情况
  {
    if (iDay == Saturday)                 //为周六时
    {
      printf("和朋友去逛街\n");
    } else                                    //为周日时
    {
      printf("在家陪家人\n");
    }
  } else                                       //工作日的情况
  {
    if (iDay == Monday)                //为周一时
    {
      printf("开会\n");
    } else                          //为其他星期时
    {
      printf("工作\n");
    }
  }
  return 0;                        //程序结束
}

程序运行结果如下图所示:
在这里插入图片描述
整段代码表示了整个 if 语句嵌套的操作过程,首先判断为休息日的情况,然后根据判断的结果选择相应的具体判断或者操作。过程如下:

  1. if 语句判断表达式1就像判断今天是星期几,假设判断结果为真,则用 if 语句判断表达式2。
  2. 例如,判断出今天是休息日,然后去判断今天是不是周六;如果 if 语句判断 iDay==Saturday 为真,那么执行语句1。如果不为真,那么执行语句2。
  3. 例如,如果为星期六就陪朋友逛街,如果为星期日就陪家人在家。外面的 else 语句表示不为休息日时的相应操作。

五、条件运算符

自增、自减以及复合赋值运算符都是C语言提供的精简运算符,那条件选择也提供了一个精简的运算符――条件运算符(又称三目运算符)。条件运算符是将3个表达式连接在一起,组成的条件表达式。条件运算符的语法格式如下:

返回值=表达式1?表达式2:表达式3;

以上语句的含义是:先对表达式1的值进行检验,如果值为真,则返回值是表达式2的结果值,如果值为假,则返回值是表达式3的结果值。示例代码:

b=a>2?2:3;

这句语句运算过程如下图所示:
在这里插入图片描述
这句代码等价于:

if(a>2)
{
   b = 2;
}
else
{
   b = 3;
}

模拟条件运算符实现美团送餐情况,假设满足15元就免费配送,否则就要加上5元的配送费,实现代码如下:

#include<stdio.h>

int main() {
  int food, fee;//定义变量存储餐费、总共费用
  printf("您的订单餐费是:\n");//提示信息
  scanf("%d", &food);//输入餐费
  fee = food >= 15 ? food : (food + 5);//利用三目运算符计算总共费用
  printf("您的订单共计%d元,请支付\n", fee);//输出总共费用
  return 0;//程序结束
}

程序运行结果如下图所示:
在这里插入图片描述

六、switch语句的基本形式

if 语句只有两个分支可供选择,而在实际问题中常需要用到多分支的选择。就像买衣服,可以有多种选择。当然,使用嵌套的 if 语句也可以采用多分支实现买衣服的选择,但是如果分支较多,就会使得嵌套的 if 语句层数较多,程序冗余并且可读性不好。在C语言中,可以使用 switch 语句直接处理像买衣服这种多分支选择的情况,提高程序代码的可读性。switch 语句是多分支选择语句,它的一般形式如下:

switch(表达式)
{
   case1:
       语句块1;
   case2:
       语句块2;case 值n:
       语句块n;
   default:
   		//default部分被省略后,当控制台输入的值与case语句后的值均不能匹配时,程序没有输出任何结果
       都不符合语句块;
}

switch 语句的程序流程如下图所示:
在这里插入图片描述
通过上图所示的流程图分析 switch 语句的一般形式。switch 语句后面括号中的表达式就是要进行判断的条件。在 switch 的语句块中,使用 case 关键字表示检验条件符合的各种情况,其后的语句是相应的操作,其中还有一个 default 关键字,作用是如果没有符合条件的情况,那么执行 default 后的默认情况语句。

说明:switch 语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而 case 语句检验的值必须是整型常量,也即可以是常量表达式或者常量运算。

通过如下代码来分析一下 switch 语句的使用方法:

#include<stdio.h>

int main() {
  int selection = 1;
  switch (selection) {
    case 1:printf("选择矿泉水\n");
      break;
    case 2:printf("选择旺仔\n");
      break;
    case 3:printf("选择脉动\n");
      break;
    default:printf("输入错啦!\n");
      break;
  }
}

其中 switch 判断 selection 变量的值,利用 case 语句检验 selection 值的不同情况。假设 selection 的值为1,那么执行 case 为1时的情况,就会输出 选择矿泉水,执行后 break 跳出 switch 语句;假设 selection 的值为2,就会输出 选择旺仔,执行后 break 跳出 switch 语句;假设 selection 的值为3,就会输出 选择脉动,执行后 break 跳出 switch 语句;如果 selection 的值不是 case 中所检验列出的情况,那么执行 default 中的语句,就会输出 输入错啦!。在每一个 case 或 default 语句后都有一个 break 关键字。break 语句用于跳出 switch 结构,不再执行 switch 下面的代码。

注意: 在使用 switch 语句时,如果没有一个 case 语句后面的值能匹配 switch 语句的条件,就执行 default 语句后面的代码。其中任意两个 case 语句都不能使用相同的常量值;并且每一个 switch 结构只能有一个 default 语句,而且 default 可以省略。

在使用 switch 语句时,每一个 case 情况中都要使用 break 语句,break 语句使得执行完 case 语句后跳出 switch 语句。如果没有 break 语句,程序会将后面的内容都执行。例如下面代码,case 语句结束后不加 break,代码如下:

#include<stdio.h>

int main() {
  int money = 0;
  printf("请查看口袋剩多少元钱?\n");
  scanf("%d", &money);
  switch (money) {
    case 7:printf("还剩%d元,吃米饭套餐\n", money);
      //没有break语句
    case 12:printf("还剩%d元,吃米线\n", money);
      //没有break语句
    case 40:printf("还剩%d元,吃披萨\n", money);
      //没有break语句
    default:printf("没钱了,你可别吃了!!!\n");
  }
}

程序运行结果如下图所示:
在这里插入图片描述
从上图可以看出,去掉 break 语句后,将 case 检验相符情况后的所有语句进行输出。因此,如果想要输出选择一种情况,break 语句在 case 语句中是不能缺少的。

七、多路开关模式的switch语句

在上一小节中,将 break 语句去掉之后,会将符合检验条件后的所有语句都输出。利用这个特点,可以设计多路开关模式的 switch 语句,它的形式如下:

switch(表达式)
{
  case 1:
    语句1;
    break;
  case 2:
  case 3:
    语句2;
    break;default:
    默认语句;
    break;
}

从形式中可以看到如果在 case 2 后不使用 break 语句,那么符合检验时与符合 case 3 检验时的效果是一样的。也就是说,使用多路开关模式,可以使多种检验条件用一个语句块输出。例如:在平年一年12个月,1、3、5、7、8、10、12月是31天,4、6、9、11月是30天,2月是28天,如果在控制台上任意输入月份,就可以知道这个月有多少天。具体代码如下:

#include<stdio.h>
int main() {
  int month;
  printf("请输入月份:\n");
  scanf("%d", &month);
  switch (month) {
    //多路开关模式
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:printf("%d月有31天\n", month);
      break;
      //多路开关模式
    case 4:
    case 6:
    case 9:
    case 11:printf("%d月有30天\n", month);
      break;
    case 2:printf("%d月有28天\n", month);
      break;
    default:printf("输入错啦,没有这个月份\n");
  }
  return 0;//程序结束
}

程序运行结果如下图所示:
在这里插入图片描述

八、if…else语句和switch语句的区别

if…else 语句和 switch 语句都用于根据不同的情况检验条件作出相应的判断。两者的流程图分别如下图所示:
在这里插入图片描述
在这里插入图片描述
下面从两者的语法和效率的比较进行讲解两者区别:

  1. 语法的比较。 if 语句是配合 else 关键字进行使用的,而 switch 语句是配合 case 语句使用的;if 语句先对条件进行判断,而 switch 语句后进行判断,也就是判断符合 case 语句的情况。
  2. 效率的比较。 if…else 结构对开始少量的检验判断速度比较快,但是随着检验的增长会逐渐变慢,其中的默认情况是最慢的。使用 if else 结构可以判断表达式,但是不容易进行后续的添加扩充。switch 结构中,对其中每一项 case 检验的速度都是相同的,default 默认情况比其他情况都快。当判定的情况占少数时,if…else 结构比 switch 结构检验速度快。也就是说,如果分支在3个或者4个以下,用 if…else 结构比较好,否则选择 switch 结构。

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习C语言的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JTS:11 Overlaps 部分重叠

这里写目录标题 版本代码1 多点与多点2 线与线3 面与面 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 /*** 部分重叠*/ public class GeometryOverlaps {private final GeometryFactory geometryFactory new GeometryFactory();private static final Logg…

提升自动化测试效率的秘密武器——Allure Report

一.使用 Allure2 运行方式-Python # --alluredir 参数生成测试报告。 # 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径)# 生成在线的测试报告 allure serve ./result二.使用 Allure2 运行方式-Ja…

TCP/IP(十四)流量控制

一 流量控制 说明&#xff1a; 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…

Vue绑定样式

一、绑定class样式 语法格式&#xff1a; :class "属性名" &#xff08;一&#xff09;字符串写法 该写法适用于样式的类名不确定&#xff0c;需要动态指定的场景 我们用如下的CSS样式进行操作演示 我们要完成点击按钮改变CSS样式的操作&#xff0c;如下图代码所…

33.高等数学

一、函数与极限。 &#xff08;1&#xff09;函数。 1.平方根&#xff1a;有正负号。 2.算术平方根&#xff1a;算术平方根都是正数。 3.复数&#xff1a;是由实部和虚部组成的数&#xff0c;可以表示为abi 的形式&#xff0c;其中 a 是实部&#xff0c;b 是虚部。如果虚部…

检验科LIS系统源码,多家二甲医院实际使用,三年持续优化和运维,系统稳定可靠

检验科LIS系统源码&#xff0c;Client/Server架构SaaS服务模式的LIS系统全套源码&#xff0c;自主版权&#xff0c;有演示。 LIS系统&#xff0c;专为医院检验科设计的一套实验室信息系统。它是以数据库为核心&#xff0c;将实验仪器与电脑连接成网&#xff0c;基础功能包括病人…

C# 中大小端Endian

大小端可以找下资料很多&#xff0c;都是文字的。我每次遇到大小端问题就会搜资料&#xff0c;总是记不住。我自己用用图片记录一下&#xff0c;以备直观的从内存中看到。 在C#中可以用BitConverter.IsLittleEndian来查询。 几个数字在内存中 我们来观察一下&#xff0c;我的…

小程序中如何设置所服务地区的时区

在全球化的背景下&#xff0c;小程序除了在中国使用外&#xff0c;还为海外的华人地区提供服务。例如我们采云小程序为泰国、阿根廷、缅甸等国家的商家就提供过微信小程序。这些商家开通小程序&#xff0c;为本地的华人提供服务。但通常小程序的开发者/服务商位于中国&#xff…

Java多线程篇(10)——BlockingQueue(数组,链表,同步阻塞队列)

文章目录 1、ArrayBlockingQueue2、LinkedBlockingQueue3、SynchronousQueue3.1、transfer 公平实现&#xff08;队列&#xff09;3.2、transfer 非公平实现&#xff08;栈&#xff09; 1、ArrayBlockingQueue put public void put(E e) throws InterruptedException {Objects…

小程序:下拉刷新+上拉加载+自定义导航栏

下拉刷新 &#xff1a; <scroll-view scroll-y"true" 允许纵向滚动 refresher-enabled"true" 开启自定义下拉刷新 默认为false :refresher-triggered&quo…

从读不完一篇文章,到啃下20万字巨著,大模型公司卷起“长文本”

点击关注 文丨郝 鑫 编丨刘雨琦 4000到40万token&#xff0c;大模型正在以“肉眼可见”的速度越变越“长”。 长文本能力似乎成为象征着大模型厂商出手的又一新“标配”。 国外&#xff0c;OpenAI经过三次升级&#xff0c;GPT-3.5上下文输入长度从4千增长至1.6万token&…

MySQL常用命令01

今天开始&#xff0c;每天总结一点MySQL相关的命令&#xff0c;方便大家后期熟悉。 1.命令行登录数据库 mysql -H IP地址 -P 端口号 -u 用户名 -p 密码 数据库名称 -h 主机IP地址 登录本机 localhost或127.0.0.1 -P 数据库端口号 Mysql默认是3306 -u 用户名 -p 密码 …

nodejs+vue+elementui医院挂号预约管理系统4n9w0

前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install Express 框架于Node运行环境的Web框架, 开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff…

公司寄件管理教程

不少企业为了规范因公寄件的管理&#xff0c;节约企业的快递成本&#xff0c;最终简化企业内部办公流程&#xff0c;提升企业整体办公效率&#xff0c;在因公寄件达到一定量的时候&#xff0c;都会推出或繁或简的“公司寄件管理制度”。 所谓的“或繁或简”。是根据企业的寄件场…

前端练习项目(附带页面psd图片及react源代码)

一、前言 相信很多学完前端的小伙伴都想找个前端项目练练手&#xff0c;检测自己的学习成果。但是现在很多项目市面上都烂大街了。今天给大家推荐一个全新的项目——电子校园 项目位置&#xff1a;https://github.com/v5201314/eSchool 二、项目介绍(部分页面展示)&#xff…

C++QT-day6

/*定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同动物的表演行为。*/ #include <iostream> using namespace std; class Animal //封装Animal类&#xff08;基类&#xff09; { private:string person; public:A…

力扣:130. 被围绕的区域(Python3)

题目&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#…

在线免费AI绘画工具

体验地址 点我进行AI绘画 使用 选择以文搜图进行绘画 提问 介绍 首先&#xff0c;我们来了解一下ChatGPT。作为一个人工智能语言模型&#xff0c;它可以自动回答你的问题、提供信息&#xff0c;并与你进行流畅的对话。它通过大量的训练数据和机器学习算法&#xff0c;学…

react–antd 实现TreeSelect树形选择组件,实现点开一层调一次接口

效果图: 注意: 当选择“否”&#xff0c;开始调接口&#xff0c;不要把点击调接口写在TreeSelect组件上&#xff0c;这样会导致问题出现&#xff0c;没有层级了 部分代码:

01Maven的工作机制: Maven作为依赖管理工具以及Maven作为构建管理工具

Maven的特点及其应用 Maven 是 Apache 软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具 Maven 作为依赖管理工具 管理jar包的规模: 随着我们使用的框架数量越来越多以及框架的封装程度也越来越高&#xff0c;项目中使用的jar包也就越来越多 配置工程依…