learn_C_deep_12 (深度理解“取整“、“取余“、“取模“运算、掌握运算符优先级 )

news2024/11/17 15:42:14

目录


关于“取整”

"取整"规则

1、向零取整 

2、向-∞取整

3、向+∞取整

4、四舍五入

关于"取模和取余"

运算符优先级 


关于“取整”

#include <stdio.h>
int main()
{
	//本质是向0取整
	int i = -2.9;
	int j = 2.9;
	printf("%d\n", i); //结果是:-2
	printf("%d\n", j); //结果是:2
	return 0;
}

        我们可以发现上面的代码在求 a / 2 的值得过程中进行了取整操作,因为在数学中 5 / 2 的结果为2.5,而我们上面的打印结果确实 2,但是为什么是2呢?在数学中2.5应该四舍五入是3,为什么结果不是3呢?这就要讲到我们取整的规则了。

"取整"规则

1、向零取整 

#include <stdio.h>
#include <tgmath.h>
int main()
{
	//本质是向0取整
	int i = -2.9;
	int j = 2.9;
	printf("%d\n", i); //结果是:-2
	printf("%d\n", j); //结果是:2

	printf("%d\n", (int)trunc(2.9));//结果是:2
	printf("%d\n", (int)trunc(-2.9));//结果是:-2
	return 0;
}

        这段代码演示了C语言中向零取整的方法。它使用了tgmath.h库中的trunc()函数来进行向零取整的操作。我们来解释一下这段代码的具体实现过程:

1. 首先,代码包含了stdio.h和tgmath.h两个库文件,前者提供了C语言标准I/O库的支持,后者提供了数学函数库的支持。

2. 接着,在main函数中定义了两个整型变量i和j,并将其分别初始化为-2.9和2.9。由于i和j的类型为整型,因此在初始化时,浮点数部分会被截断,只保留整数部分,i的值为-2,j的值为2。

3. 然后,代码使用printf()函数分别打印了变量i和j的值。打印结果分别为-2和2,符合预期。

4. 接下来,代码使用trunc()函数对2.9和-2.9进行了向零取整的操作,并将结果强制转换成整型,然后使用printf()函数打印了结果。向零取整的过程中,该函数会将小数部分直接截断,只保留整数部分。由于2.9和-2.9的小数部分分别为0.9和-0.9,因此向零取整后的结果分别为2和-2。

        总之,这段代码演示了C语言中向零取整的方法,使用trunc()函数可以轻松实现该操作。

2、向-∞取整

#include <stdio.h>
#include <tgmath.h> //因为使用了floor函数,需要添加该头文件
int main()
{
	//本质是向-∞取整,注意输出格式要不然看不到结果
	printf("%.1f\n", floor(-2.9)); //-3
	printf("%.1f\n", floor(-2.1)); //-3
	printf("%.1f\n", floor(2.9)); //2
	printf("%.1f\n", floor(2.1)); //2
	return 0;
}

        这段代码演示了C语言中向-∞取整(floor)的方法。它使用了tgmath.h库中的floor()函数来进行向下取整的操作。我们来解释一下这段代码的具体实现过程:

1. 首先,代码包含了stdio.h和tgmath.h两个库文件,前者提供了C语言标准I/O库的支持,后者提供了数学函数库的支持。

2. 接着,在main函数中使用floor()函数对四个浮点数进行向下取整的操作,并使用printf()函数打印了四个结果。在使用printf()函数时,使用了格式化输出,%.1f指输出一个浮点数,保留一位小数(四舍五入)。这里特别注意,我们在使用格式化输出时,必须使用%f来输出浮点数,而不能使用%d来输出整数,因为%d会将浮点数转换成整数,并截取掉小数部分,造成输出错误。

3. 向-∞取整的过程中,floor()函数会将浮点数向-∞取整到最接近且小于等于该数的整数。例如,-2.9的向下取整结果为-3,而2.1的向下取整结果为2,符合预期。

        总之,这段代码演示了C语言中向-∞取整的方法,使用floor()函数可以轻松实现该操作。在使用printf()函数输出结果时,需要注意格式化输出的使用,以避免数据类型截断和输出错误。

3、向+∞取整

#include <stdio.h>
#include <tgmath.h>
int main()
{
	//本质是向+∞取整,注意输出格式要不然看不到结果
	printf("%.1f\n", ceil(-2.9)); //-2
	printf("%.1f\n", ceil(-2.1)); //-2
	printf("%.1f\n", ceil(2.9)); //3
	printf("%.1f\n", ceil(2.1)); //3
	return 0;
}

        这段代码演示了C语言中向+∞取整(ceil)的方法。它使用了tgmath.h库中的ceil()函数来进行向+∞取整的操作。我们来解释一下这段代码的具体实现过程:

1. 首先,代码包含了stdio.h和tgmath.h两个库文件,前者提供了C语言标准I/O库的支持,后者提供了数学函数库的支持。

2. 接着,在main函数中使用ceil()函数对四个浮点数进行向+∞取整的操作,并使用printf()函数打印了四个结果。在使用printf()函数时,使用了格式化输出,%.1f指输出一个浮点数,保留一位小数(四舍五入)。同样,我们也需要注意输出格式。

3. 向+∞取整的过程中,ceil()函数会将浮点数向+∞取整到最接近且大于等于该数的整数。

4、四舍五入

#include <stdio.h>
#include <tgmath.h>
int main()
{
	//本质是四舍五入
	printf("%.1f\n", round(2.1));
	printf("%.1f\n", round(2.9));
	printf("%.1f\n", round(-2.1));
	printf("%.1f\n", round(-2.9));
	return 0;
}

        

这是一个C语言程序,功能是使用`<tgmath.h>`头文件中的`round()`函数进行四舍五入操作,并输出结果。

具体解释如下:

1. `#include <stdio.h>`和`#include <tgmath.h>`是C语言的头文件,用于引入标准输入输出和复数数学库。

2. `int main()`是程序的主函数,表示程序从这里开始执行。

3. `printf()`是C语言的输出函数,用于将格式化的数据输出。

4. `round()`是`<tgmath.h>`库中的函数,用于对一个浮点数进行四舍五入操作。其返回值也是一个浮点数,结果取决于函数参数的小数部分。如果小数部分大于等于0.5,则向正无穷方向舍入;否则向负无穷方向舍入。

5. `%.1f`是输出格式控制符,表示输出一个浮点型数值并精确到小数点后一位。

6. `return 0`是程序正常结束时返回的值。此处表示程序成功执行完毕,并将0作为返回值。

总结

关于"取模和取余"

取模概念:

        如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r 且0 ≤ r < d。其中,q 被称为商,r 被称为余数。

#include <stdio.h>
int main()
{
	int a = 10;
	int d = 3;
	printf("%d\n", a % d); //结果是1
	//因为:a=10,d=3,q=3,r=1 0<=r<d(3)
	//所以:a = q*d+r -> 10=3*3+1
	return 0;
}

如果是下面的代码呢?

#include<stdio.h>
int main()
{
	int a = -10;
	int d = 3;
	printf("%d\n", a/d); //C语言中是-3
	printf("%d\n", a % d);//结果是-1
	return 0;
}

上面的是在c语言编译器的结果,下面是python编译器出现的结果。

结论:很显然,上面关于取模的定义,并不能满足语言上的取模运算。

是什么决定了这种现象

        由上面的例子可以看出,具体余数r的大小,本质是取决于商q的。 而商,又取决谁呢?取决于除法计算的时候,取整规则。

        在c语言中,我们求得得商是-3,因为c语言的取整规则是向零取整。而在python中,我们求的商是-4,这是因为python中的取整规则是向-∞取整

取余和取模一样吗?

        细心的同学,应该看到了,我上面的取模都是带着" "的。说明这两个并不能严格等价(虽然大部分情况差不多)
取余或者取模,都应该要算出商,然后才能得出余数。


本质 1 取整:
取余:尽可能让商,进行向0取整。
取模:尽可能让商,向 -∞方向取整。

故:
C中%, 本质其实是取余。
Python中% ,本质其实是取模。

理解:

        
        对任何一个大于0的数,对其进行0向取整和 - ∞取整,取整方向是一致的。故取模等价于取余
        对任何一个小于0的数,对其进行0向取整和 - ∞取整,取整方向是相反的。故取模不等价于取余


同符号数据相除,得到的商,一定是正数(正数vs正整数),即大于0!
故,在对其商进行取整的时候,取模等价于取余。

本质 2 符号:
参与取余的两个数据,如果同符号,取模等价于取余。 

        c语言环境下:

     python语言环境下:

如果参与运算的数据,不同符号呢?

明显结论:如果不同符号,余数的求法,参考之前定义。而余数符号,与被除数相同。

 很明显,不符合上面的规律,余数符号,与被除数完全相反。这是为什么呢?

总结:

1、浮点数(或者整数相除),是有很多的取整方式的。

2、如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r| < |d|。其中,q 被称为商,r 被称为余数。

3、在不同语言,同一个计算表达式,“取模”结果是不同的。我们可以称之为分别叫做正余数 和 负余数

4、具体余数r的大小,本质是取决于商q的。而商,又取决于除法计算的时候,取整规则。 5、取余vs取模: 取余尽可能让商,进行向0取整。取模尽可能让商,向-∞方向取整。

6、参与取余的两个数据,如果同符号,取模等价于取余

7、如果参与取余的两个数据符号不同,在C语言中(或者其他采用向0取整的语言如:C++,Java),余数符号,与被 除数相同。(因为采用的向0取整)

运算符优先级 

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

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

相关文章

【C++】 排列与组合算法详解(进阶篇)

文章目录 写在前面算法1&#xff1a;朴素算法思路缺点 算法2&#xff1a;递推预处理思路时间复杂度&#xff1a; O ( n 2 ) O(n^2) O(n2) 算法3&#xff1a;阶乘逆元思路时间复杂度&#xff1a; O ( n log ⁡ n ) O(n \log n) O(nlogn)思考&#xff1a;读者也可以尝试写 O ( n…

PySide6/PyQT多线程之 多线程 与 线程池的模板(拿来即用)

前言 关于PySide6/PyQT多线程系列的最后一篇。写这篇文章的动机是方便后续代码的直接复用。 本篇文章实际是水文&#xff0c;给出了 PySide6/PyQT的多线程以及线程池的基础使用模板&#xff0c;方便后面有需要时候直接拿来就用。 多线程 这里分两种情况来谈论&#xff0c;有返…

[Hadoop]MapReduce与YARN

目录 大数据导论与Linux基础 Apache Hadoop、HDFS MapReduce MapReduce思想 MapReduce设计构思 MapReduce介绍 MapReduce官方实例 Map阶段执行流程 Reduce阶段执行流程 shuffle机制 YARN YARN介绍 YARN架构、组件 程序提交YARN交互流程 YARN资源调度器Scheduler…

IOS新建应用

一&#xff1a;Application App。普通app。Document App。打开是记事本类似App。Game。新建游戏相关app。RealityKit为新建一个打开摄像机&#xff0c;一个Ar立方体的应用。 SenceKit为有一架飞机旋转的游戏App。 SpirteKit为一个手指头按上会出一个手指特效的应用。 Metal为一…

【IDEA使用指南】使用Hibernate框架的Java项目,如何通过数据库表自动生成实体模型?

文章目录 【IDEA使用指南】使用Hibernate框架的Java项目,如何通过数据库表自动生成实体模型?步骤1:找到并打开“Persistence”工具栏。步骤2:找到并打开“Import Database Schema” 窗口。步骤3:配置数据源信息步骤4:查看自动生成的实体模型。【IDEA使用指南】使用Hibern…

如何在IDEA中显示时序图

如何在IDEA中显示时序图 有时候&#xff0c;我们想要了解代码的运行过程的时候&#xff0c;想要看到方法的调用流程。 这个时候就希望有一个时序图可以看&#xff0c;但是人工来画时序图太麻烦了&#xff0c;有没有办法在IDEA中直接生成呢&#xff1f; 当然是可以的。 这里…

Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案

文章目录 问题描述解决方案&#xff1a; 问题描述 Access denied for user ‘root’‘localhost’:拒绝用户’root’localhost’的访问。 出现这个报错语句的一般原因是输入了错误的密码&#xff0c;也有可能是是root帐户默认不开放远程访问权限。 相关的解决方法是重新设置…

【Linux】sysfs文件系统

【Linux】sysfs文件系统 前言 一、sysfs文件系统 1.1 sysfs系统是什么 1.2 sysfs的运行机制原理 二、sysfs中重要的结构体 2.1 kobject和kset之间的关系 2.2 kobject结构体 2.3 kset结构体 前言 重要的环节&#xff1a;带着问题不断前进 sysfs文件系统是什么sysf文件系…

YOLOv5 实例分割入门

介绍 YOLOv5 目标检测模型以其出色的性能和优化的推理速度而闻名。因此,YOLOv5 实例分割模型已成为实时实例分割中最快、最准确的模型之一。 在这篇文章中,我们将回答以下关于 YOLOv5 实例分割的问题: YOLOv5检测模型做了哪些改动,得到了YOLOv5实例分割架构?使用的 Prot…

RTC实时时钟源码分析

1.先来看一下RTC的配置过程 2.RTC源码讲解 我们的工程中加入了 rtc.c 源文件和 rtc.h头文件&#xff0c;同时&#xff0c;引入了 stm32f10x_rtc.c 和 stm32f10x_bkp.c 库文件。 说明&#xff0c;首先是 RTC_Init&#xff0c;其代码如下&#xff1a; //实时时钟配置 //初始化…

UI自动化测试遇弹窗怎么办?这个解决方法你get到了没?

目录 引言 弹窗的种类: APP内的业务弹窗 弹窗处理 watcher的使用 实战案例 软件测试技术的准备和建议 一、测试基础 二、Linux必备知识 三、Shell脚本 四、互联网程序原理 五、MySQL数据库 六、抓包工具 七、接口测试工具 八、Web自动化测试Java&Python 九…

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址&#xff1a;遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面&#xff1a;关于C语言这部分内容&#xff0c;…

msys2 pacman 安装 ncurses-devel 解决 make menuconfig 问题

问题描述 windows 下使用 msys2 环境&#xff0c;可以开发编译一些 Linux 下的软件包&#xff0c;一般Linux 下的软件包&#xff0c;需要安装 PC 平台的gcc、gcc交叉编译工具链&#xff0c;如 arm的&#xff0c;以及一些常用的 软件包&#xff0c;如 python 等 有一个软件包&a…

【工具】Ubuntu 非root用户 安装openssl

文章目录 openssl 下载 & 解压指定安装路径编译安装配置环境变量验证是否安装成功 openssl 下载 & 解压 openssl 下载地址 或者 https://www.openssl.org/source/openssl-1.1.1l.tar.gz 上传到服务器 解压 tar -zxvf openssl-1.1.1l.tar.gz切换到openssl-1.1.1l目…

maven-resources-plugin详解

目录 一、什么场景会用到&#xff1f;二、他有什么作用&#xff1f;三、插件常用配置1、字符集编码2、resources相关的配置2.1、resources配置结构2.2、resources默认配置2.2.1、maven超级pom默认配置2.2.2、spring-boot对resources插件的默认配置2.2.3、resources最终生效的配…

2023年最新VMware 17+虚拟机详细配置安装【程序员使用指南】!!

文章目录 Vmware版本选择17Pro安装自定义安装填写对应的许可证正式安装虚拟机进行对应的配置配置镜像文件选择对应的语言&#xff1a;到这个界面&#xff0c;选择中文 安装结束连接对应的xshell Vmware版本选择17Pro安装 ● 最开始从这里出发 自定义安装 ● 记得自定义在自…

TikTok选品,什么产品在TikTok最受欢迎?

TikTok是当下的海外社交媒体推广新风口已经有目共睹&#xff0c;与此同时跨境商家们或许都面临着同样的问题&#xff0c;就是TikTok要怎么选品&#xff0c;什么产品才会比较受欢迎。俗话说&#xff1a;七分靠选品&#xff0c;三分靠运营。选品选对了&#xff0c;运营也就事半功…

chatgpt赋能Python-python3_decode函数

Python3 decode函数 - 解码你的数据 编程领域中&#xff0c;字符串是一个不可避免的概念&#xff0c;他们构成了我们生活中逻辑化和技术实现化的重要组成部分。不仅如此&#xff0c;字符串的加载和使用也对程序的性能产生了重大的影响。在这篇文章中&#xff0c;我们将重点讨论…

现在有什么基于vue3.0的优秀开源项目呢?

前言 以下是一些github上一些基于vue3.0的优秀开源项目&#xff0c;可以自己选择一些去练一下手&#xff0c;废话少说&#xff0c;直接进入正题---- 1、 vue-manage-system Star: 16k 是一个基于 Vue3 和 Element Plus 的后台管理系统解决方案&#xff0c;它提供了一系列的通…

电脑找不到msvcr110.dll怎么办?电脑msvcr110.dll丢失怎么解决?

在使用某些软件或游戏时&#xff0c;有时会出现找不到msvcr110.dll文件的错误提示&#xff0c;这会导致程序无法正常运行。这个问题通常是由于缺少Visual C msvcr110.dll引起的。下面是解决这个问题的几个方法&#xff1a; msvcr110.dll的解决方法一 直接使用dll修复程序进行修…