当前位置: 首页 > news >正文

C Primer Plus 第5章——第一篇

你该逆袭了

第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);        // 1printf("integer division: 6/3  is  %d  \n", 6 / 3);        // 2printf("integer division: 7/3  is  %d  \n", 7 / 4);        // 1printf("floating division: 7./4. is  %1.2f \n", 7. / 4.);  // 1.75printf("floating division: 7./4  is  %1.2f \n", 7. / 4);   // 1.75return 0;
}
//整数除法 会截断计算结果的小数部分(丢弃整个小数部分),不会 四舍五入 结果。//混合整数 和 浮点数 计算的结果是 浮点数。
//实际上,计算机不能真正用 浮点数 除以 整数,
//编译器会把两个运算对象转换成相同的类型。
//本例中,在进行除法运算前,整数 会被转换成 浮点数。

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

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

#include <stdio.h>int main()
{printf("%d\n", -5 / 2);    // -2return 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  4n, sizeof n, intsize);return 0;
}//C语言规定,sizeof 返回 size_t 类型的值。这是一个 无符号整形 类型。//C99 做了进一步调整,新增了 %zd 转换说明用于 printf() 显示 size_t 类型的值。
//如果系统不支持 %zd,可使用 %u 或者 %lu 代替 %zd。

2、求模运算符:%

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

3、递增运算符:++

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

4、递减运算符:- -

类同。

5、优先级

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

6、不要自作聪明

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ | Leetcode C++题解之第318题最大单词长度乘积
  • git clone private repo
  • 【iOS】多界面传值
  • pycharm中安装、使用扩展工具,以QT Designer为例
  • Centos 8系统xfs文件系统类型进行扩容缩容 (LVM)
  • C++初学者指南-5.标准库(第二部分)--更改元素算法
  • 【Spring Boot】用 Spring Security 实现后台登录及权限认证功能
  • Java高级
  • Linux手动编译方式安装httpd及配置系统服务(含不同安装方式简介)
  • AI认知理解
  • C语言 | Leetcode C语言题解之第318题最大单词长度乘积
  • springcloud和springboot版本对照表
  • ChatGPT协助撰写研究论文的11种方法【全集】
  • 第九十八周周报
  • C++的vector类
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Angular4 模板式表单用法以及验证
  • Babel配置的不完全指南
  • docker-consul
  • emacs初体验
  • JavaScript 基本功--面试宝典
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Material Design
  • spring cloud gateway 源码解析(4)跨域问题处理
  • underscore源码剖析之整体架构
  • vue-router 实现分析
  • 从0实现一个tiny react(三)生命周期
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 项目实战-Api的解决方案
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用Python写一份独特的元宵节祝福
  • 原生Ajax
  • Java数据解析之JSON
  • ​比特币大跌的 2 个原因
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #QT项目实战(天气预报)
  • #stm32整理(一)flash读写
  • (152)时序收敛--->(02)时序收敛二
  • (C++哈希表01)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (编译到47%失败)to be deleted
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (循环依赖问题)学习spring的第九天
  • (一)认识微服务
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功