【C】分支与循环1----if与switch

news2025/1/14 1:14:08

分支与循环

C语言是一门结构化的程序设计语言

  • 顺序结构
  • 选择结构
  • 循环结构

if语句

if

if 语句的语法形式如下:

if(表达式)
	语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真

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

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

过程如下:
在这里插入图片描述

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

分支中包含多条语句

默认在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只能控制一条语句
如果需要控制多条语句,要使用大括号
大括号里面叫作程序块,或代码块 ,或复合语句

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

嵌套if

在if else 语句中,else 可以与另一个if 语句连用,构成多重判断

比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:

#include <stdio.h>
int main()
{
	int num=0;
	scanf("%d",&num);
	if(num ==0)	
		printf("输入的数字是e\n");	
	else 
	{
		if(num > 0)//这里的f相当于嵌套在else语句中,形成了嵌结构	
		printf("输入的数字是正数\n");	
		else	
		printf("输入的数字是负数\n");	
	}
	return ;	
}

可以写成:

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

练习:

输入一个人的年龄 如果年龄<18岁,打印"少年"
如果年龄在18岁至44岁打印"青年’
如果年龄在45岁以上打印h

#include <stdio.h>
int main()	
{	
	int age =0;
	scanf("%d",&age);	
	if (age < 18)	
		printf("少年\n");	
 	else if (age >= 18 && age <= 44)
		printf("青年\n");
	else printf("h");
	return 0;	
}

不可以写成 18<=age<=44
这是个恒成立的式子
先判断age时候大于等于18,返回1/0(成立/不成立),而无论是1还是0都比44小

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

将上面的代码放入VS中,会发现代码自动变为下面这种格式:

#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对其无关
所以在编写代码时,要适当使用大括号

关系操作符

C语言用于比较的表达式,称为“关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。.大于运算符小于运算符

  • 大于等于运算符 >=
  • 小于等于运算符 <=
  • 相等运算符 == (=赋值)
  • 不相等运算符 !=

关系表达式通常返回0或1 , 表示真假
关系表达式常用于 ifwhile结构

 if(x==3)
 {
	printf("x is 3.(n");
}

注意:相等运算符 ==与赋值运算符=是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

 if (x=3)...

这个式子表示对变量x赋值3,它的返回值为3,所以if 判断总是为真

建议:当一个变量和一个常量值比较相等的时候,可以将变量写在等号的右边

 if (3==x)...

这样的话,如果将==误写成=, 编译器就会报错

另一个需要避免的错误是:多个关系运算符不宜连用

i<j<k

上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

 (i <j) <k

上面式子中,**i<j返回0或1,所

i<j&&j<k

条件操作符

条件操作符也叫三目操作符,需要三个操作数

ecp1 ? exp2 : exp3//表达式1 ? 表达式2 :表达式3

条件操作符的计算逻辑是:

如果exp1 为真,exp2计算,计算的结果是整个表达式的结果;
如果exp1为假, exp3计算,计算的结果是整个表达式的结果

练习1:使用条件操作符表示下面代码的逻辑

 #include (stdio.h)
 int main()
 {
	int a=0;	
	int b=0;	
	scanf("%d",&a);	
	if (a>5)
		b=3;	
	else	
		b=-3;	
	printf("%d\n",b);	
	return 0;
 }

改造后:

` #include (stdio.h)
 int main()
 {
	int a=0;	
	int b=0;	
	scanf("%d",&a);	
	b=(a>5?3:-3);
	printf("%d\n",b);	
	return 0;
 }

练习2.找出两个数较大值

` #include (stdio.h)
 int main()
 {
	int a=0;	
	int b=0;
	int m=0;	
	scanf("%d",&a);	
	if (a>b)
		m=a;	
	else	
		m=b;	
	printf("%d\n",m);	
	return 0;
 }

逻辑操作符: &&,ll,!

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

  • ! 逻辑取反运算符(改变单个表达式的真假)。
  • && 逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假).
  • || 逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
  • :C语言中,非0表示真,0表示假

逻辑取反运算符 !

在这里插入图片描述
用法如下:

#include <stdio.h>
int main(){
	int flag = 0;
	scanf("%d", &flag);
	//flag为真,做一些事
	if (flag)
		printf("do something\n");	
	//flag为假,做一些事
	if (!flag)
		printf("do sometning\n");
	return 0;
{

&& 逻辑与运算符

&& 就是与运算符,也是并且的意思,&&是一个双目操作符,使用的方式是a&&b
&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假

在这里插入图片描述

|| 逻辑或运算符

||就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式是a ll b
||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假

在这里插入图片描述

短路

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++;
	printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
	printf("i=%d\n",i);
	return 0;
}

输出为:1 2 3 4 0

#include <stdio.h>
int main()
{
	int i = 0,a =1,b=2,c=3,d=4;
	i=a++&&++b&&d++;
	printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
	printf("i=%d\n",i);
	return 0;
}

输出为:2 3 3 5 1

#include <stdio.h>
int main()
{
	int i = 0,a =1,b=2,c=3,d=4;
	i=a++||++b||d++;
	printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
	printf("i=%d\n",i);
	return 0;
}

输出为: 2 2 3 4 1

#include <stdio.h>
int main()
{
	int i = 0,a =0,b=2,c=3,d=4;
	i=a++||++b||d++;
	printf("a = %d\n b =%d\nc = %d\nd = %d\n", a, b,c,d);
	printf("i=%d\n",i);
	return 0;
}

输出为: 1 3 3 4 1

switch 语句

switch 语句是一种特殊形式的if…else结构,用于判断条件有多个结果的情况

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

上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行 default分支
:
switch 后的 expression必须是整型表达式
case 后的值,必须是整形常量表达式

if语句和switch语句的对比

练习:输入任意一个整数值,计算除3之后的余数

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

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

如果使用switch语句完成,如下:

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

switch 语句也是分支效果的,只有在switch语句中使用break 才能在跳出switch 语句
如果某一个 case 语句的后边没有break 语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到 break 语句或者 switch 语句结束

break 也不是每个case 语句都得有,得根据实际情况来看

eg:
1.输入1~5,输出的是“工作日”;
2.输入6~7,输出“休息日”

int main(){
	int day =0;
	scanf("%d", &day);
	switch (day)//char也可以
	{
	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;
}

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

在switch 语句中case 语句和 default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以
不过通常是把 default 子句放在最后处理

最后:

找到真正热爱的事,并为之付出时间和耐心,享受这一过程中的高光时刻,也不惧路上的艰难坎坷
这是对漫长岁月最好的回馈
保持热爱,奔赴山海,追光的你终会光芒万丈…

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

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

相关文章

【React】使用脚手架或Vite包两种方式创建react项目

1.使用脚手架搭建React项目&#xff1a; 在终端窗口运行如下命令即可&#xff1a; npx create-react-app react-basic(创建的文件目录) npx&#xff1a;Node.js工具命令&#xff0c;用于查找并执行后续的包命令。 2.使用Vite包创建React项目&#xff1a; 在终端窗口运行如…

Jetpack-Room

Room是Android Jetpack中的一个组件&#xff0c;它提供了一个抽象层&#xff0c;帮助开发者在本地数据库&#xff08;如SQLite&#xff09;上进行持久化数据存储。Room通过简化数据库操作&#xff0c;使得数据管理变得更加容易和高效。 Room重要的概念 实体&#xff08;Entit…

Facebook上的隐私保护:如何加强个人数据的安全性?

在数字化时代&#xff0c;个人数据的保护已成为用户日益关注的话题&#xff0c;尤其是在社交媒体平台如Facebook上。用户在享受社交媒体带来的便利时&#xff0c;如何有效保护个人隐私&#xff0c;维护自身的数据安全&#xff0c;成为了一个亟需解决的问题。 Facebook的隐私保护…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

若依-医疗系统

项目介绍 湘雅三医院医疗系统是根据长沙市湘雅第三医院来开发的一款后台管理系统&#xff0c;是基于SpringBoot和Vue2开发的一款前端后端分离项目&#xff0c; 项目中包括&#xff1a;1&#xff1a;权限认证&#xff0c;动态菜单2&#xff1a;用户管理&#xff0c;部门管理&am…

2024年诺贝尔物理学奖:机器学习与神经网络的历史性突破

2024年诺贝尔物理学奖的揭晓引发了广泛的讨论&#xff0c;因为这次的获奖者并非传统意义上的物理学家&#xff0c;而是来自机器学习与神经网络领域的研究者——John J. Hopfield 和 Geoffrey E. Hinton。这一决定不仅让人惊讶&#xff0c;也让我们重新思考物理学的边界和诺贝尔…

Microsoft 的指南可帮助缓解 Kerberoasting

随着网络威胁不断演变&#xff0c;安全专业人员必须了解最新的攻击媒介和防御机制。 Kerberoasting是一种众所周知的 Active Directory (AD) 攻击媒介&#xff0c;由于使用 GPU 加速密码破解技术&#xff0c;其有效性正在不断提高。 由于 Kerberoasting 可让网络威胁者窃取凭…

模拟电路设计期末速成总结

模拟电路设计期末速成总结 模拟电路设计是电子工程和电气工程专业中的一门重要基础课&#xff0c;主要研究连续时间信号&#xff08;模拟信号&#xff09;的处理和应用。期末复习时&#xff0c;针对这门课可以分为以下几个关键内容进行速成总结。 一、基本概念与元件 模拟信号…

Python酷库之旅-第三方库Pandas(150)

目录 一、用法精讲 681、pandas.Timestamp.now方法 681-1、语法 681-2、参数 681-3、功能 681-4、返回值 681-5、说明 681-6、用法 681-6-1、数据准备 681-6-2、代码示例 681-6-3、结果输出 682、pandas.Timestamp.replace方法 682-1、语法 682-2、参数 682-3、…

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析 在 Nest.js 应用中&#xff0c;当你试图通过 request.ip 获取客户端的 IP 地址时&#xff0c;如果总是返回 ::1 或者 ::ffff:127.0.0.1&#xff0c;这通常意味着请求来自本地主机。 因为在前后端分离应用中&#xff0c;前端请求后端服务一般的做法都是通过代理&…

查看记录Linux当前系统环境下已经安装好的CUDA和cuDNN版本信息

在实际工作中&#xff0c;经常需要接触服务器&#xff0c;有时候在实施部署的时候需要对裸机进行安装和部署&#xff0c;涉及到深度学习环境搭建的话就会比较耗时一些&#xff0c;为了简化操作工作以及保证与开发好的模型完美兼容最好的办法就是与我们自己的开发机器保持完全相…

Unity 2D角色的跳跃与二段跳示例

如图&#xff0c;实现这样的效果 其实非常简单&#xff0c;就两个必要条件 触发&#xff1a;一定是按下触发 跳跃次数&#xff1a;一定大于0 声明跳跃次数 public int jumpCount;//多段跳次数 还有一个可以优化的点&#xff0c;就是如果你想角色的多段跳可以有第一次跳的那么…

C语言复习概要(六)

公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一&#xff0c;理解…

无极低码课程【mysql windows下安装要点】

在Windows环境中安装MySQL 5.7教程 MySQL 是世界上最流行的开源关系型数据库管理系统之一。本教程将指导您在Windows操作系统上安装MySQL 5.7。 网上教程较多&#xff0c;这里不再详述&#xff0c;注意关键点即可 准备工作 下载MySQL 5.7安装包 访问 MySQL官方网站 下载MyS…

新年好——Dijkstra+Permutation

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int, int> PII; const int N 5e410, M 2e510; const int inf 0x3f3f3f3f; int n, m; int a[6]; int h[N], e[M], ne[M], idx, w[M]; int dist[6][N];…

用Python实现运筹学——Day 17: 0-1 整数规划

一、学习内容 1. 0-1 整数规划的定义 0-1 整数规划是一类特殊的整数规划问题&#xff0c;决策变量只能取 0 或 1。它常用于解决选择问题&#xff0c;如是否选择某个项目、是否执行某个任务等。决策变量 ​ 通常表示“选择”&#xff08;&#xff09;或“不选择”&#xff08;…

实用宝典:元器件外贸独立站电子元件数据库设置完全手册

对于投身于元器件外贸领域的企业来说&#xff0c;如何建立一个既能凸显自身特色又具备高度功能性与良好用户体验的独立站&#xff1f;而在这一过程中&#xff0c;#电子元件数据库#作为独立站的核心要素之一&#xff0c;它的构建质量和管理方式又将如何直接影响网站的整体竞争力…

Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)

引言 想象一下&#xff0c;只要描述你想要的画面&#xff0c;电脑就能帮你画出来。这在几年前还像是科幻小说里的场景&#xff0c;但随着神经网络和潜在扩散模型&#xff08;LDM&#xff09;技术的发展&#xff0c;现在已经成为可能。OpenAI 推出的 DALLE 工具&#xff0c;因其…

STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计

简介 项目开发过程中&#xff0c;采用STM32L151 芯片进行涉及&#xff0c;其中需要使用其片上ADC进行多路ADC数据采样。这里就记录一下实际这块的开发过程&#xff0c;其中涉及工程代码再项目中实际投产使用。STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计…

【文心智能体 | AI大师工坊】通过知识库优化智能体『万圣节之纸人还魂』:探索恐怖剧本杀的奇幻之旅

文章目录 1.1、智能体运行效果1.2、创作灵感来源1.3、如何制作智能体1.4、可能会遇到的几个问题1.5、快速调优指南 My_优质智能体『万圣节之纸人还魂&#x1f47b;』&#xff1a;https://aq58pt.smartapps.baidu.com/?_swebfr1&_swebScene3611000100000000 在当今人工智能…