[C语言]——分支和循环(2)

news2025/1/19 2:36:43

目录

一.逻辑操作符:&& , || , !

1.逻辑取反运算符! 

2.与运算符&&

3.或运算符

4.练习:闰年的判断  

5.短路

二.switch语句

1.if语句和switch语句的对比 

2.switch语句中的break

3.switch语句中的default

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


一.逻辑操作符:&& , || , !

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
  • ! :逻辑取反运算符(改变单个表达式的真假)。
  • && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
  • || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假

1.逻辑取反运算符! 

 ⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{
 int flag = 0;
 if(!flag)
 {
   printf("do something\n");
 }
 return 0;
}
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真。所以上⾯的代码的意思就是 flag 为假,执行if语句中的代码。

2.与运算符&&

&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。 ⽐如:如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?
 int month = 0;
 scanf("%d", &month);
 if(month >= 3 && month <= 5)
 {
  printf("春季\n");
 }
这⾥表达的意思就是month既要⼤于等于3,⼜要⼩于等于5,必须同时满足。

3.或运算符

|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。 ⽐如:我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{
  printf("冬季\n");
}

4.练习:闰年的判断  

输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
(1)能被4整除并且不能被100整除是闰年
(2)能被400整除是闰年
#include <stdio.h>
//代码1
int main()
{
 int year = 0;
 scanf("%d", &year);
 if(year%4==0 && year%100!=0)
   printf("是闰年\n");
 else if(year%400==0)
   printf("是闰年\n");
 return 0;
}

//代码2
int main()
{
 int year = 0;
 scanf("%d", &year);
 if((year%4==0 && year%100!=0) || (year%400==0))
   printf("是闰年\n");
 return 0;
}

5.短路

C语言逻辑运算符还有⼀个特点,它 总是先对左侧的表达式求值,再对右边的表达式求值 ,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如前面的代码:
if(month >= 3 && month <= 5)
表达式中&&的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。所以, 对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行
对于 || 操作符是怎么样呢?我们结合前⾯的代码:
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。 所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值
练习:阅读代码,计算代码输出的结果
#include <stdio.h>
int main()
{
 int i = 0,a=0,b=2,c =3,d=4;
 i = a++ && ++b && d++; //a++一开始为0,故++b和d++都没计算
 //i = a++||++b||d++;  i=0/1,逻辑运算符的结果,这里a=1 b=3 c=3 d=4 i=1
 printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);  //a=1 b=2 c=3 d=4 i=0
 return 0;
}

//若inta=1,则最后输出a=2 b=3 c=3 d=5 i=1

二.switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}
上面代码中,根据 表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,
就执行 default 分支
注:
  • switch 后的 expression 必须是整型表达式(不能是字符)
  • case 后的值,必须是整形常量表达式(例如2+1也行)

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;
 }
 return 0;
}
上述的代码中,我们要注意的点有:
  • case 和后边的数字之间必须有空格
  • 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句

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;
}
测试⼀组,看⼀下结果:

我们发现,7除以3本来余数是1,但是我们发现程序运⾏的结果多了⼀⾏“余数是2”的打印。 原因是 switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上⾯的代码就执⾏了 case2 中的语句。 所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。 

练习:
输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
参考代码如下:
#include <stdio.h>
int main()
{
 int day = 0;
 scanf("%d", &day);
 switch(day)
 {
 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;
 case 6:
   printf("星期六\n");
   break;
 case 7:
   printf("星期天\n"); 
   break;
 }
 return 0;
}
如果需求发⽣变化,变为:
(1)输⼊1-5,输出的是“⼯作⽇”;
(2)输⼊6-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;
 }
 return 0;
}

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

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

switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实, 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实
际需求的就可以。 不过我们通常是把 default 子句放在最后处理的。(常用思维:最后输出无用的)

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

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

相关文章

docker 数据卷 详解与实践

常见的数据卷命令 命令 说明 文档地址 docker volume create 创建数据卷 docker volume create docker volume ls 查看所有数据卷 docs.docker.com docker volume rm 删除指定数据卷 docs.docker.com docker volume inspect 查看某个数据卷的详情 docs.docker.co…

MIT 6.S081---Lab: Multithreading

Uthread: switching between threads (moderate) 修改uthread.c&#xff0c;在thread中新增context字段&#xff1a; 修改uthread.c&#xff0c;在thread_create函数中新增以下逻辑&#xff1a; 修改uthread.c中的thread_switch函数定义&#xff1a; 修改uthread.c中的th…

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 刷题https://leetcode.cn/problems/fibonacci-number/description/文章讲解https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解https://www.bilibili.com/video/BV…

框架漏洞--->Log4j2 Shiro1.2.4反序列化基础

上次讲了thinkphp 那么这次我们就来讲一下log4j2 1.关于log4j2的原理 ----> CVE-2021-44228 当时这个漏洞出来的时候&#xff0c;可以说是轰动了全球~!!!!! 当时基本上是用这个框架的都爆出了这个漏洞 于是&#xff0c;它就在框架漏洞中占有了一席重要之地&#xff01;&am…

【C语言 数据结构】堆与二叉树(下)

接着上次的&#xff0c;这里主要介绍的是堆排序&#xff0c;二叉树的遍历&#xff0c;以及之前讲题时答应过的简单二叉树问题求解 堆排序 给一组数据&#xff0c;升序&#xff08;降序&#xff09;排列 思路 思考&#xff1a;如果排列升序&#xff0c;我们应该建什么堆&#x…

Redis面试题(答案版)2024

基础内容 1、简单介绍以下你了解的Redis &#xff08;1&#xff09;高性能&#xff1a;Redis是基于内存的&#xff0c;读写速度非常快&#xff0c;可以支持10w的QPS。 &#xff08;2&#xff09;用途多样&#xff1a;缓存、消息队列、分布式锁等 &#xff08;3&#xff09;支持…

物联网电气融合实训室建设方案

1 教学实训总体设计 1.1 建设背景 &#xff08;一&#xff09;政策推动与战略部署 近年来&#xff0c;物联网技术在全球范围内得到了广泛的关注和应用。作为信息技术的重要组成部分&#xff0c;物联网在推动经济转型升级、提升社会管理水平、改善民生福祉等方面发挥着重要作…

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在&#xff0c;让我们开始体验“说明提示技巧”&#xff08;IPT, Instructions Prompt Technique&#xff09;和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

FPGA-串口接收图像写入RAM并读出在TFT显示屏上显示

系统框图&#xff1a; 需要用到的模块有&#xff1a; 1&#xff0c;UART_RX(串口接收模块)&#xff1b; 2&#xff0c;串口接受的数据存放到RAM模块&#xff1b; 3&#xff0c;RAM IP核&#xff1b; 4&#xff0c;时钟IP核 &#xff08;TFT显示屏驱动时钟的产生&#xff09…

理解循环神经网络(RNN)

文章目录 1. 引言&#xff1a;什么是RNN以及它的重要性RNN简介RNN在机器学习中的作用和应用场景 2. RNN的工作原理神经网络基础RNN的结构和运作方式循环单元的作用 3. RNN的关键特点与挑战参数共享长期依赖问题门控机制&#xff08;例如LSTM和GRU&#xff09;代码示例&#xff…

【Vue】vue3 在图片上渲染 OCR 识别后的文本框、可复制文本组件

需求 后面返回解析后的文本和四角坐标&#xff0c;在图片上渲染成框&#xff0c;并且可复制。图片还可以缩放、拖拽 实现 这里要重点讲下关于OCR文本框的处理&#xff1a; 因为一些文字可能是斜着放的&#xff0c;所有我们要特殊处理&#xff0c;根据三角函数来计算出它的偏…

openEuler学习——部署MGR集群

本文介绍如何利用GreatSQL 8.0.25构建一个三节点的MGR集群。 1.安装准备 IP端口角色192.168.20.1103306mgr1192.168.20.1113306mgr2192.168.20.1123306mgr3 配置hosts解析 [rootMGR1 ~]# cat >> /etc/hosts << EOF > 192.168.20.110 MGR1 > 192.168.20.1…

小程序商城营业执照办哪种类型的?

在数字化浪潮的推动下&#xff0c;越来越多的商家选择通过微信小程序商城来拓展线上业务。但在启动小程序商城之前&#xff0c;有一项关键性的准备工作不可忽视——那就是营业执照的办理。本文将为您详细解读小程序商城营业执照的办理类型及相关流程步骤&#xff0c;帮助您顺利…

虚拟机时间同步主机

1.查看是否设置同步 2.查看时区 date -R 0800 表示时区东八区 明显不对 执行指令&#xff1a; tzselect &#xff1b;找到亚洲-中国-北京 3.覆盖一下文件 复制文件到 /etc/localtime 目录下&#xff1a;#sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4.重现查…

【DAY08 软考中级备考笔记】机组:计算机组成和数据转换

机组&#xff1a;计算机组成和数据转换 3月2日 – 天气&#xff1a;晴 1. 计算机的基本组成结构 计算机的硬件由运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入和输出设备组成其中&#xff0c;控制器和运算器成为CPU控制器又分为了内部存储器和外部存储器。内部…

Python与FPGA——膨胀腐蚀

文章目录 前言一、膨胀腐蚀二、Python实现腐蚀算法三、Python实现膨胀算法四、Python实现阈值算法五、FPGA实现腐蚀算法总结 前言 腐蚀是指周围的介质作用下产生损耗与破坏的过程&#xff0c;如生锈、腐烂等。而腐蚀算法也类似一种能够产生损坏&#xff0c;抹去部分像素的算法。…

FX110网:判断行情是真突破还是假突破?用这几招就够了

众所周知&#xff0c;在交易过程中&#xff0c;趋向线的突破对买入、卖出时机等选择具有重要的分析意义。因此&#xff0c;搞清趋势线何时突破&#xff0c;是有效的突破还是非有效的突破&#xff0c;于投资者而言是至关重要的。 本文将提供一些对于趋向线突破的判断方法和市场原…

学习Java的第三天

如何使用IDEA工具编写Java语言 上一节课已经讲过了&#xff0c;如何使用文本文档写出代码并在管理员控制台打印出来 接下来给大家分享的是使用IntelliJ IDEA工具 一、如何将IntelliJ IDEA设置成中文 1、点击右上角的图标&#xff0c;有人的图标会不一样&#xff0c;但位置是…

停工待料,责任真的全在PMC吗?天行健深度剖析背后的原因

在现代制造业中&#xff0c;停工待料的现象时有发生&#xff0c;这不仅影响了生产进度&#xff0c;还增加了企业的运营成本。很多人会自然而然地将责任归咎于生产物料控制&#xff08;PMC&#xff09;部门&#xff0c;认为是他们没有做好物料计划和管理。但事实上&#xff0c;停…

【Web】浅浅地聊SnakeYaml反序列化两条常见利用链

目录 关于Yaml 关于SnakeYaml SnakeYaml反序列化利用 JdbcRowSetImpl链 ScriptEngineManager链 复现 基本原理 继续深入 关于Yaml 学过SpringBoot开发的师傅都知道&#xff0c;YAML和 Properties 文件都是常见的配置文件格式&#xff0c;用于存储键值对数据。 这里举…