C Primer Plus 第5章——第一篇

news2024/9/24 1:19:13

你该逆袭了

第5章:重点摘录

  • 零、章节介绍
  • 一、基本运算符
    • 1、赋值运算符
      • (1)、数据对象
      • (2)、左值
      • (3)、右值
      • (4)、运算符
    • 2、加法运算符
    • 3、减法运算符
    • 4、符号运算符:- 和 +
    • 5、乘法运算符:*
      • 1、指数增长
    • 6、除法运算符:/
    • 7、运算符优先级
    • 8、优先级 和 求值顺序
  • 二、其他运算符
    • 1、sizeof 运算符 和 size_t 类型
    • 2、求模运算符:%
    • 3、递增运算符:++
    • 4、递减运算符:- -
    • 5、优先级
    • 6、不要自作聪明

零、章节介绍

1、关键字:while、typedef
2、运算符:=、-、*、/ 、%、++、–、
3、C语言的各种运算符,包括用于普通数学运算的运算符
4、运算符优先级以及语句、表达式的含义
5、while循环
6、复合语句、自动类型转换和强制类型转换
7、如何编写带有参数的函数

一、基本运算符

1、赋值运算符

赋值表达式语句的目的:把值储存到内存位置上。

几个术语:数据对象、左值、右值、运算符

(1)、数据对象

用于储存值的数据存储区域

(2)、左值

C语言的术语,用于标识特定数据对象的名称或表达式。
左值:用于标识或定位存储位置的标签。
由于C语言的发展,C标准新增了一个术语:可修改的左值。
可修改的左值:用于标识可修改的对象。
当前的C标准建议:使用术语 对象定位值 更好。

(3)、右值

能赋值给可修改左值的量。
当前标准在描述这一概念的时,使用的是:表达式的值。

(4)、运算符

“吃汉堡”:“吃” 就是 “运算符操作”;“汉堡” 就是 “运算对象”

int ex;
int why;
int zee;
const int TWO = 2;
why = 42;
zee = why;
ex = TWO * (why + zee);

ex、why、zee 都是可修改的左值(或对象定位值),
它们可用于赋值运算符的 左侧 和 右侧 。

TWO 是不可改变的左值,
它只能用于赋值运算符的右侧。

表达式(why + zee)是右值,
该表达式不能表示 特定内存位置,而且不能给它赋值。
它只是程序计算的一个临时值,在计算完毕后便会丢弃。

2、加法运算符

income = salary + bribes;

income、salary、bribes、都是 可修改的左值。
表达式:salary + bribes,是一个右值。

3、减法运算符

income = 12 - 6;

4、符号运算符:- 和 +

rocky = -12;
jack = +12;

5、乘法运算符:*

1、指数增长

棋盘中计算谷粒的总数

//P109 程序清单5.5
#include <stdio.h>
#define SQUARES 64      //棋盘中的方格数

int main()
{
	const double CROP = 2E16;
	double current = 0;
	double total = 0;
	int count = 1;

	printf("square      grains      total      ");
	printf("fraction of\n");
	printf("            added       grains     ");
	printf("world total\n");
	total = current = 1.0;             //从 1 颗谷粒开始
	printf("%4d %15.2e %11.2e %10.2e\n", count, current, total, total / CROP);
	while (count < SQUARES) 
	{
		count = count + 1;
		current = 2.0 * current;       //下一个方格谷粒翻倍
		total = total + current;       //更新总数
		printf("%4d %15.2e %11.2e %10.2e\n", count, current, total, total / CROP);
	}
	printf("That's all\n");

	return 0;
}

在这里插入图片描述

6、除法运算符:/

截断:在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为 截断。

//P110 程序清单5.6
//演示除法
//截断:在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为 截断。

#include <stdio.h>

int main()
{
	printf("integer division: 5/4  is  %d  \n", 5 / 4);        // 1
	printf("integer division: 6/3  is  %d  \n", 6 / 3);        // 2
	printf("integer division: 7/3  is  %d  \n", 7 / 4);        // 1

	printf("floating division: 7./4. is  %1.2f \n", 7. / 4.);  // 1.75
	printf("floating division: 7./4  is  %1.2f \n", 7. / 4);   // 1.75

	return 0;
}
//整数除法 会截断计算结果的小数部分(丢弃整个小数部分),不会 四舍五入 结果。

//混合整数 和 浮点数 计算的结果是 浮点数。
//实际上,计算机不能真正用 浮点数 除以 整数,
//编译器会把两个运算对象转换成相同的类型。
//本例中,在进行除法运算前,整数 会被转换成 浮点数。

整数除法 会截断计算结果的小数部分(丢弃整个小数部分),不会 四舍五入 结果。

混合整数 和 浮点数 计算的结果是 浮点数。
实际上,计算机不能真正用 浮点数 除以 整数,
编译器会把两个运算对象转换成相同的类型。
本例中,在进行除法运算前,整数 会被转换成 浮点数。

#include <stdio.h>

int main()
{
	printf("%d\n", -5 / 2);    // -2

	return 0;
}

//C99标准以前,C语言给语言的实现者留有一些空间,让他们来决定如何进行负数的整数除法。
//一种方法是:舍入过程 采用小于或等于 浮点数 的最大整数。
//当然,对于 3.8 而言,处理后的 3 符合这一描述。
//但是 -3.8 会怎样?
//该方法建议四舍五入为 -4,因为 -4 小于 -3.8.
//但是,另一种舍入方法是 直接丢弃小数部分。
//这种方法被称为 趋零截断,即把 -3.8 转换成 -3.
//在C99以前,不同的实现采用不同的方法。
//但是 C99 规定使用 趋零截断。
//所以,应把 -3.8 转换成 -3.

C99标准以前,C语言给语言的实现者留有一些空间,让他们来决定如何进行负数的整数除法。
一种方法是:舍入过程 采用小于或等于 浮点数 的最大整数。
当然,对于 3.8 而言,处理后的 3 符合这一描述。
但是 -3.8 会怎样?
该方法建议四舍五入为 -4,因为 -4 小于 -3.8.
但是,另一种舍入方法是 直接丢弃小数部分。
这种方法被称为 趋零截断,即把 -3.8 转换成 -3.
在C99以前,不同的实现采用不同的方法。
但是 C99 规定使用 趋零截断。
所以,应把 -3.8 转换成 -3.

7、运算符优先级

如果两个运算符的 优先级 相同怎么办?
如果它们处理同一个运算对象,则根据他们在语句中出现的顺序来执行。
对大多数运算符而言,
这种情况都是按从左到右的顺序来进行(=等个别运算符除外)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、优先级 和 求值顺序

如果两个运算符的 优先级 相同怎么办?
如果它们处理同一个运算对象,则根据他们在语句中出现的顺序来执行。
对大多数运算符而言,
这种情况都是按从左到右的顺序来进行(=等个别运算符除外)

运算符优先级 为表达式中的求值顺序提供重要的依据,但是并没有规定所有的顺序。C 给语言的实现者留有选择的余地。考虑下面的语句:

y = 6 * 12 + 5 * 20;

当运算符共享一个运算对象时,优先级决定了求值顺序。
例如上面的语句中,12 是 * 和 + 运算符的运算对象。
根据运算符的优先级,* 的优先级比 + 高,所以先进行 * 运算。
类似地,先对 5 进行 * 运算,而不是 + 运算。
简而言之,先进行两个 * 运算:6 * 12 和 5 * 20,再进行 + 运算。

但是,优先级并未规定到底先进行哪一个 * 运算。
C 语言把主动权留给语言的实现者,根据不同的硬件来决定先计算前者还是后者。
可能在一种硬件上采用某种方案效率更高,而在另一种硬件上采用另一种方案效率更高。
无论采用那种方案,表达式都会简化未 72 + 100,所以这并不影响最终的结果。

但是,读者可能会根据乘法从左往右的结合律,认为应该先执行 + 运算符左边的乘法。

结合律只适用于 共享 同一运算对象运 算符。
例如,在表达式 12 / 3 * 2 中,/ 和 * 运算符的优先级相同,共享运算对象 3.
因此,从左往右的结合律 在这种情况下起作用。

表达式简化为 4 * 2 ,即 8 (如果从右往左计算,会得到 12 / 6,即 2 ,这种情况下计算的先后顺序会影响最终的计算结果)。

y = 6 * 12 + 5 * 20;

在该例中,两个 * 运算符并没有共享用一个运算对象,因此从左往右的结合律不适用这种情况。

在这里插入图片描述
在这里插入图片描述

二、其他运算符

C 语言大约有 40 个运算符,以下介绍 4 个比较有用的运算符。

1、sizeof 运算符 和 size_t 类型

C语言规定,sizeof 返回 size_t 类型的值。这是一个 无符号整形 类型。

C99 做了进一步调整,新增了 %zd 转换说明用于 printf() 显示 size_t 类型的值。
如果系统不支持 %zd,可使用 %u 或者 %lu 代替 %zd。

#include <stdio.h>

int main()
{
	int n = 0;
	size_t intsize;

	intsize = sizeof(int);
	printf("n= %d, n has %zd bytes; all ints have %zd bytes.\n",     //  0  4  4
			n, sizeof n, intsize);

	return 0;
}

//C语言规定,sizeof 返回 size_t 类型的值。这是一个 无符号整形 类型。

//C99 做了进一步调整,新增了 %zd 转换说明用于 printf() 显示 size_t 类型的值。
//如果系统不支持 %zd,可使用 %u 或者 %lu 代替 %zd。

2、求模运算符:%

% 只能用于整数,不能用于浮点数。
在这里插入图片描述

3、递增运算符:++

在这里插入图片描述
在这里插入图片描述

4、递减运算符:- -

类同。

5、优先级

只有 圆括号 的优先级 比 递增运算符(++)和递减运算符(–) 高。
在这里插入图片描述
在这里插入图片描述

6、不要自作聪明

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python实战:wxauto与百度千帆大模型结合快速实现微信智能回复机器人

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

VGA接口驱动设计验证

前言 VGA接口是一个很有历史的接口&#xff0c;全称为Video Graphics Array&#xff08;VGA&#xff09;视频图形阵列&#xff0c;是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。时至今日&#xff0c;这个接口依然还在大量使用&#xff0c;因为这个接口…

普乐蛙VR航天科普展厅VR虚拟现实项目激发青少年对太空探索

普乐蛙品牌VR沉浸体验式业态&#xff0c;定位文旅科教领域&#xff0c;助力中国航天发展。普乐蛙VR航天航空主题拥有华夏神舟、天宫一号、华夏月球车、太空飞船、华夏方舟、地震平台、暴风空间等众多科普体验设备和原创优质的航天航空内容&#xff0c;通过沉浸互动式体验&#…

USB 2.0 规范摘录

文章目录 1、USB 体系简介2、USB 数据流模型四种传输类型 3、USB 物理规范和电气规范4、USB 协议层规范事务传输&#xff08;Transaction&#xff09;的流程 5、USB 框架6、USB 主机&#xff1a;硬件和软件7、USB HUB 规范数据的转发唤醒信号的转发USB HUB 的帧同步HUB Repeate…

11087 统计逆序对(优先做)

这个问题可以通过使用分治策略来解决&#xff0c;这种策略是在归并排序的基础上进行的。我们可以将数组分为两部分&#xff0c;然后分别计算两部分的逆序对数量&#xff0c;最后计算跨越两部分的逆序对数量。 以下是使用C的代码实现&#xff1a; #include <iostream> #…

C++初学者指南-5.标准库(第二部分)--更改元素算法

C初学者指南-5.标准库(第二部分)–更改元素算法 文章目录 C初学者指南-5.标准库(第二部分)--更改元素算法填充/覆盖范围fill / fill_ngenerate / generate_n 更改/替换值transformreplace / replace_ifreplace_copy / replace_copy_if 相关内容 不熟悉 C 的标准库算法&…

【数据泄露】最新 FBI 官员数据库泄露事件

前言 近日&#xff0c;一名化名为 “rpk” 的威胁行为者在 breachforums 论坛上声称泄露了包含 22,175 名 FBI 官员数据的数据库。此事件迅速引起了广泛关注&#xff0c;主要因为 FBI 作为美国联邦调查局&#xff0c;不仅是美国司法部的主要调查机构&#xff0c;还是美国情报界…

太离谱!曝 GPT-4o mini 没做安全测试就开庆功会!OpenAI 严重违背政府协议,被立法者犀利追问 12 条

OpenAI又被曝违约了!这次是违反了对白宫的安全承诺。 去年夏天,OpenAI向美国政府承诺,将严格对其前沿的突破性技术进行安全测试,以确保AI不会造成损害,比如教用户制造生化武器或帮助黑客开发新型网络攻击。 然而,为了应对OpenAI领导层设定的GPT-4o mni 5月份的“deadli…

RabbitMQ高级特性 - 消息分发(限流、负载均衡)

文章目录 RabbitMQ 消息分发概述如何实现消费分发机制&#xff08;限制每个队列消息数量&#xff09;使用场景限流背景实现 demo 非公平发送&#xff08;负载均衡&#xff09;背景实现 demo RabbitMQ 消息分发 概述 RabbitMQ 的队列在有多个消费者订阅时&#xff0c;默认会通过…

MySQL —— 库,数据类型 与 表

库与基础操作 1.1 查看数据库 使用 show databases; 可以查看当前 MySQL 目前有多少个数据库 5 rows 表示有 5 行&#xff0c;这里是表示的是有效的数据&#xff0c;不包括 第一行的指引 set 表示结果集合 0.01 sec 表示这个 sql 语句一共运行了0.01 秒&#xff0c;一般情况…

【多线程】线程的五种创建方法

文章目录 线程在 Java 代码中编写多线程程序Thread 标准库 创建线程的写法1 . 继承 Thread 类代码回调函数休眠操作&#xff1a;sleep()抢占式执行观察线程jconsoleIDEA 内置调试器 2 . 实现 Runnable 接口代码 3. 匿名内部类创建 Thread ⼦类对象代码匿名内部类 4.匿名内部类创…

Python数据分析案例57——信贷风控模型预测评估及其可解释性(shap, scorecardpy包应用)

案例背景 在信贷风控场景下&#xff0c;其实模型的可解释性就变得很重要。在平时做一些普通的机器学习的案例的时候&#xff0c;我们根本不关心这些变量是怎么究竟影响到模型最后的决策的&#xff0c;随便直接把数据丢进去&#xff0c;再把要预测的数据丢进去就能出结果。但是…

Rabbitmq的几种工作模式

工具类 public class RabbitMQConnection {public static Connection getConnection() throws Exception{//1.创建connectionFactoryConnectionFactory connectionFactory new ConnectionFactory();//2.配置HostconnectionFactory.setHost("127.0.0.1");//3.设置Po…

kafka从浅入深

一、什么是kafka&#xff1f; kafka本质上是一个消息队列MQ&#xff08;Message Queue&#xff09;&#xff0c;用做数据流转。 1.使用消息队列的好处&#xff1f; 1.1、解耦&#xff1a;允许独立扩展或修改队列两头的处理过程&#xff1b; 1.2、可恢复性&#xff1a;即使一个…

Unity 资源之 Break Items - Toon VFX破碎物品与卡通硬币动画分享

Unity 特效资源分享 - 破碎物品与卡通硬币动画 一、前言二&#xff0c;资源包内容三、免费获取资源包 一、前言 今天为大家带来一份超级实用的视觉特效资源分享&#xff01;我们精心整理了 6 个令人惊叹的破碎物品效果和 1 个萌趣十足的卡通硬币动画视觉特效&#xff0c;让您的…

编译和汇编的区别

一、编译 编译是将高级语言&#xff08;如C、C、Java等&#xff09;编写的源代码转换成计算机可以直接执行的低级语言&#xff08;通常是机器语言或汇编语言&#xff09;的过程 编译 —— 将人类可读的源代码转换为计算机可执行的指令集 编译过程 通常包括词法分析、语法分…

bootloader开发总结

bootloader开发总结 首先明白了BootLoader和应用程序之间跳转&#xff0c;就明白了大概。上电启动程序&#xff0c;会有一个程序入口&#xff0c;这个入口由0x33fff6(28335的)地址决定。 应用程序也会有一个启动入口&#xff0c;这个用户可以自己决定。 bin文件是高地址在前&a…

【数据结构】非线性表----二叉树详解

二叉树与普通的树的本质上的区别实际上只有一个——子结点的数量。 普通的树&#xff1a;任意数量的子结点 二叉树&#xff1a;只有两个子结点&#xff0c;也称为左孩子和右孩子结点。 二叉树一共有五种形态&#xff1a; 1.空二叉树。 2.只有一个根结点。 3.根结点只有左子树…

【OpenCV C++20 学习笔记】图像缩放-高斯金字塔

图像缩放-高斯金字塔 原理高斯金字塔 代码实现放大缩小形成金字塔 原理 在图像处理中&#xff0c;经常需要将图像转化成不同的尺寸&#xff0c;即放大或缩小。 除了直接用resize()函数重新设置图片尺寸&#xff0c;另一种常用的方法就是“图像金字塔”。 图像金字塔是从底层的…

vector的底层原理剖析及其实现

vector 一、定义二、常用接口及模拟实现三、vector迭代器失效问题四、使用memcpy拷贝会出现的问题五、二维数组vector<vector< T >> vv 一、定义 vector 是 C 标准模板库&#xff08;Standard Template Library, STL&#xff09;中的一个非常有用的容器。它是一个…