Linux嵌入式学习——c语言选择结构设计

2023-11-15

一、if语句

c语言中选择结构最常用的是if语句实现的。

1.1if语句的一般格式

if(表达式) 语句1
	[else 语句2]

表达式可以是关系表达式逻辑表达式数值表达式

1.2if语句常用的3种形式

(1)if(表达式) 语句1   //没有else字句部分
(2)if(表达式)        //有else字句的部分
	语句1
	else 
	语句2
(3)if(表达式1) 语句1  (在else部分又嵌套了多层的if语句)
   else if(表达式2) 语句2 
   else if(表达式3) 语句3
    .    .
    .    .
    .    .
    else if(表达式m) 语句m
    else            语句m+1

例如:

if (number>500) cost = 0.15;
else if(number>300) cost = 0.10;
else if(number>100) cost = 0.075;
else if(number>50)  cost = 0.05;
else 				cost = 0;

这种格式也相当于下面这种形式,更直观简洁。

if(number > 500)
	cost = 0.15;
else
	if(number > 300)//在if语句的else部分嵌套了一个if语句
		cost = 0.10;
	else
		if(number > 100)//在if语句的else部分又嵌套了一个if语句
			cost = 0.075;
		else
			if(number > 50)//在第二层内嵌的if语句的else部分又嵌套了一个if语句
				cost = 0.05;
			else
				cost = 0;//在第三层内嵌的if语句中的else子句
	

**在系统对if语句进行编译的时候,若发现内嵌套语句结束,还要检查后面是否有else,如果没有则认为if语句结束,如果有else语句,则把else语句作为if语句的一部分,注意:else字句不能单独使用,必须与if语句配套使用。

1.3if语句的嵌套

一般形式
if的数目和else的数目相同,从内层到外层一一对应。

if()
	if()  语句1
	else  语句2
else
	if()  语句3
	else  语句4

如果if和else的数目不一致,可以加花括号确定配对关系

if()
{
	if() 语句1
}
else	语句2

二、关系运算符和关系表达式

在c语言中常把比较运算符称为关系运算符,是将两个数值进行比较,判断其比较的结果是否满足给定的条件。

2.1关系运算符及其优先次序

关系运算符 含义
< 小于
<= 小于等于
> 大于
>= 大于等于
== 等于
!= 不等于
  1. 前四种优先级别相同,后两种优先级别相同。前4种高于后2种
  2. 关系运算符的优先级低于算数运算符。
  3. 关系运算符的优先级高于赋值运算符。
低于
低于
赋值运算符
关系运算符
算数运算符

注意:有多级运算符的时候,建议加上括号,便于理解
例如:

c > a+b//关系运算符的优先级低于算数运算符
等价于
c > (a+b)

2.2关系表达式

关系表达式是将两个数值或者数值表达式连接起来的式子,关系表达式的值是一个逻辑值,“真”或“假”。
例如:

  1. d = a>b;//由于a>b为真所以赋值后d的值为1
  2. d = a>b;//若a>b为假,那么赋值后d的值为0

三、逻辑运算符和逻辑表达式

用逻辑运算符将关系表达是或其他逻辑量连接起来的式子就是逻辑表达式。

3.1逻辑运算符及优先次序

3中逻辑运算符

  1. 与(AND)符号(&&)含义:同真为真,一假为假

  2. 或(OR)符号(||)含义:全假为假,有真为真

  3. 非(NOT)符号(!)含义:取反

  4. “&&”和“||”是双目运算,要求有两个运算对象
    例如:(a>b) && (b>c)或者 (a>b) || (b>c)

  5. "!"是单目运算符,只要求有一个运算对象
    例如:! (a>b)
    优先级
    在这里插入图片描述

3.2逻辑表达式

逻辑表达式是一个逻辑值“真”或“假”
用1表示真,用0表示假
注意:以0代表为假,以非0代表为真

例如:

  1. a = 4,b = 5;a&&b为真
  2. a = -1,b =5;a&&b为真

逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是字符型,浮点型,枚举型,或者指针型的纯量型数据,最后系统不符都会以0和非0来判断他们是属于“真”还是“假”
例如:

  1. ‘c’ &&'d’因为c和d的ASCII码不为0故按真值处理

注意:在逻辑表达式中,并不是所有的逻辑运算符都会被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
例如:

  1. a && b && c。只有a为真(非0)时,才需要判断b的值。只有在a和b都为真的时候才需要判断c的值。如果a为假,就不用判断b和c(此时整个表达式已经确定为假),如果a为真,b为假,不用判别c
对于&&运算符,只有a不等于0,a为真的时候,才可以进行后面的运算
  1. a||b||c。只要a为真(非0),就不必判断b和c.只有a为假,才判别b,a和b都为假,才判断c
对于||运算符,只有a=0的时候,才进行右边的运算

四、三目运算符和表达式

4.1三目运算符的一般形式

表达式1?表达式2:表达式3
如果表达式1为真,取表达式2的值
如果表达式1为假,取表达式3的值

例如:

max = (a>b)? a:b //a大于b吗,如果大于,就把a的值赋给m否则把b的值赋给m
a>b? (max = a):(max = b);
等价于:
if(a>b) max = a;
else    max = b;
a>b ? printf("%d",a):printf("%d",b)
等价于:
if(a>b)
	printf("%d",a);

五、switch语句

5.1switch一般形式

switch(表达式)
{
	case	常量1 :语句1
	case	常量2 :语句2
	.		.      .
	.		.      .
	case	常量n :语句n
	default:	语句n+1
	
}

说明

  1. 表达式的类型应该是整型(包括字符型)
  2. case后面跟一个常量或者常量表达式
  3. 可以没有default标号,如果没有与switch表达式相匹配的case常量,则不执行任何语句,则转到switch语句的下一个语句
  4. 各个case标号出现次序不影响执行结果
  5. 每一个case常量必须不同,否则矛盾

注意:
在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行,最后一个case子句中可以不加break语句,因为流程已经到了switch结构的结束处。

六、综合举例

写一个程序判断某一年为闰年

思路:满足以下条件之一
可以用逻辑表达式来写。

①能被4整除,但不能被100整除,如2008
②能被400整除,如2000

(year%4==0 && year%100!=0) || year%400==0

year为整数(年份),如果上述表达式的值为真,则year为闰年,否则不是闰年。

!((year%4==0 && year%100!=0) || year%400==0)
(year%4!=0) || (year%100==0 && year%400!=0)

可以加一个!来判断非闰年,表达式为真,则year为非闰年。
代码1如下:

  1. year代表年份,leap是一个标志变量,用来表示相应的年份是否为闰年。leap=1表示为闰年,leap=0表示非闰年。
#include <stdio.h>
int main()
{	
	int year,leap;
	printf("enter year:");
	scanf("%d",&year);
	if(year%4==0){
		if(year%100!=0){
			leap = 1;
		}else{
			leap = 0;
		}
	}else{
		if(year%400==0){
			leap = 1;
		}else{
			leap = 0;
		}
	}
	if(leap){//if(leap!=0)等价
		printf("%d is a leap year",year);	
	}else{
		printf("%d is not a leap year",year);
	}
	return 0;
}

代码2如下:

#include <stdio.h>
int main()
{	
	int year,leap;
	printf("enter year:");
	scanf("%d",&year);
	if(year%4!=0)
		leap = 0;
	else if (year%100!=0)//能被4整除,但是不能被100整除 
		leap = 1;
	else if(year%400!=0)
		leap = 0;
	else 				//能被400整除
		leap = 1;
	
	if(leap){
		printf("%d is a leap year",year);	
	}else{
		printf("%d is not a leap year",year);
	}
	return 0;
}

代码3:用逻辑表达式包含所有的闰年条件

#include <stdio.h>
int main()
{	
	int year,leap;
	printf("enter year:");
	scanf("%d",&year);
	if(	(year%4==0 && year%100!=0) || year%400==0){
		leap = 1;
	}else{
		leap = 0;
	}
	
	if(leap){
		printf("%d is a leap year",year);	
	}else{
		printf("%d is not a leap year",year);
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux嵌入式学习——c语言选择结构设计 的相关文章

  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include

随机推荐

  • Windows下Apache Tomcat 8安装配置

    1 环境配置 1 安装好jar jdk文件包 jdk1 8 0 66与jre1 8 0 66 打开我的电脑 属性 高级 环境变量 新建系统变量JAVA HOME 和CLASSPATH 变量名 JAVA HOME 变量值 C Program
  • vue调用高德地图实现定位

    vue调用高德地图实现定位 第一步创建高德地图key 第二步 下载vue amap npm install vue amap save 第三步 在项目main js引入vue amap import AMap from vue amap V
  • RedmiBook pro15 2023款折腾笔记(7840HS)amd-pstat解决APU睿频问题

    这里记录一下RedmiBook pro15 2023款笔记本 7840HS 搭建ubuntu 22 04系统的记录 留给正好需要在这个笔记本上安装linux环境的童鞋参考一下 其他AMD的APU都是类似的 拿到机器过后安装ubuntu 22
  • 操作系统终端输入大小限制

    问题描述 使用c 写算法题时 测试用例是一个长字符串 上万字符 但运行结果显示字符串读入的长度远远小于输入长度 并且不同操作系统下面显示出了不同的bug macos 输入字符串长度只有1000 超过这个长度成都就会卡在cin那行代码 ubu
  • 裸片IC的简单介绍以及裸片IC的封装设计

    最近项目一直用到一种比较旧的PCB生产工艺 裸片IC 也就是绑定的工艺 1 什么是裸片IC 裸片既是在加工厂生产出来的芯片 即是晶圆经过切割测试后没有经过封装的芯片 大小一般在几毫米左右 边上有用于连接金属线的的焊盘或者小孔 金属线这是连接
  • 02rapidJson学习之数组的创建、遍历

    02rapidJson学习之数组的创建 遍历 概述 创建数组时我们需要注意以下内容 1 不能直接返回数组 我试过不行 因为数组必须依赖某一对象 即若我们不将数组添加到doc上 而直接返回数组是不行的 1 数组的创建 从doc中获取strin
  • Github 本地合并 (merge) 他人提交的 pr

    Github 上有些项目可能作者长时间没有进行维护 会出现有些新的 pr 没有合并到主分支 master 上 这时如果想在本地应用这个新的 pr 呢 一般来说主要有以下几种方式 针对提交的pr 查看具体的改动文件和改动内容 然后在本地进行对
  • git log 后一直出现:(冒号)的原因以及处理方法

    博客主页 https blog csdn net mukes 欢迎点赞 收藏 留言 如有错误敬请指正 本文由 mukes 原创 首发于 csdn 问题重现 在 git bash 中输入 git log 时出现 冒号 如下图所示 问题描述 一
  • Android酷炫实用的开源框架(UI框架)

    Android酷炫实用的开源框架 UI框架 前言 忙碌的工作终于可以停息一段时间了 最近突然有一个想法 就是自己写一个app 所以找了一些合适开源控件 这样更加省时 再此分享给大家 希望能对大家有帮助 此博文介绍的都是UI上面的框架 接下来
  • web初始

    个人学习开始 写的不好 请大佬指教
  • 机器学习实战——Kmeans聚类算法

    机器学习实战 Kmeans聚类算法 1 聚类算法介绍 1 1 K 均值聚类 1 2 聚类效果的评价 2 sklearn中的实现 1 聚类算法介绍 在无监督学习中 训练样本的标记是未知的 目标是通过对无标记训练样本的学习来揭示数据的内在性质及
  • 纷玩岛演唱会下单代码

    继大麦M端之后 再发现一个演唱会平台 纷玩岛 此平台不像大麦 猫眼那么火爆 相对来说比较容易研究 通过抓包软件发现下单很简单 就一个JWT登录后的头部token而已 下载地址 https download csdn net download
  • 结构体对函数指针的高级封装应用

    分层设计考虑 作用 降低对底层应用程序的高耦合度 示例 include mac h typedef struct phy t char channel char snd fail count char name char open flag
  • 软件测试用例覆盖率怎么算,如何计算增量测试覆盖率

    为了保证代码质量 一般会要求提交的源码要有测试用例覆盖 并对测试覆盖率有一定的要求 在实践中不仅会考核存量代码覆盖率 总体覆盖率 还会考核增量代码的覆盖率 或者说增量覆盖率更有实际意义 测试用例要随源码一并提交 实时保证源码的质量 而不是代
  • 进程和线程的区别,以及应用场景

    什么是线程 Linux下线程用进程PCB模拟描述 也叫轻量级进程 线程是进程内部的一个执行流 也就是线程在进程的地址空间内运行 一个进程内的所有线程共享进程资源 线程是CPU调度的基本单位 CPU调度是按照PCB进行调度的 创建 销毁一个线
  • Mule入门——DB、Rest、Soap接口开发

    一 DB查询接口开发 这里我用的mysql数据库 首先我们先查询下我们的数据库这里有很多数据 然后我们用AnypointStudio进行我们的接口开发 首先我们先新建一个Mule工程 File gt New gt Mule project
  • 计算机网络---传输层

    两个端的会话层之间提供建立 维护和取消传输连接的功能 这一层 数据传送的协议单元成为报文 网络层只是根据网络地址将源节点发出的数据包送到目的终点 而传输层负责将数据可靠的传送到相应的端口 传输层负责将上层数据分段提供端到端 可靠不可靠的传输
  • vue3-admin-template页面

    vue3 admin template 本人学习视频网址为 视频地址 源码 github 网页采用技术框架 本管理模板采用vue3开发 使用vue router来作为路由跳转 将登录成功后产生的菜单 token放入到vuex中存储 通过ax
  • 一般Python开发面试中可能会问到的大部分问题

    python语法以及其他基础部分 可变与不可变类型 浅拷贝与深拷贝的实现方式 区别 deepcopy如果你来设计 如何实现 new 与 init 的区别 你知道几种设计模式 编码和解码你了解过么 列表推导list comprehension
  • Linux嵌入式学习——c语言选择结构设计

    Linux嵌入式学习 c语言选择结构设计 一 if语句 1 1if语句的一般格式 1 2if语句常用的3种形式 1 3if语句的嵌套 二 关系运算符和关系表达式 2 1关系运算符及其优先次序 2 2关系表达式 三 逻辑运算符和逻辑表达式 3