课程内容#
C 语言的数学运算#
-
-
= 赋值
- 可以与和其他运算符结合使用:+=、<<=、...
-
/ 除以
- 左右都是整数:整除,下取整
- 左右至少有一个浮点数:得到的才是浮点数
-
() 提高运算优先级
-
⭐位运算,效率高
- 计算机对于不同的数据类型,都统一按二进制数据存储,即按 bit 位存储
- 8bit→1byte
- int 类型是 32 位 bit,对于有符号的最大能表示 2^31-1
- 位运算时,①先展开成二进制位表示,②只有对应的位之间有关系
- 位运算不支持浮点数?
- 没有意义。对于 64 位的浮点数,最高的 1 位是符号位 S,接着的 11 位是指数 E,剩下的 52 位为有效数字 M。
- 如果按位与,前面 12 位运算规则是什么呢?即指数位相与结果的意义是什么呢?这就是本质了,两个浮点数相与没有数学意义啊。
- ^ 异或
- 特点:是自己的逆运算;支持交换律、结合律
- 逆运算
- 前提:符合交换律
- 减法、除法不符合
- 减法是加法的逆运算,反之不是
- 除法是乘法的逆运算,反之不是 [非严格,未考虑乘数为 0]
- 前提:符合交换律
-
<<左移>> 右移
- 左移一位,乘以 2
- 右移一位,除以 2,下取整,符号不变
- 左边一直补符号位(最高位为符号位的有符号数)
- 左边强制补 0(无符号数)
C 语言的数学函数#
头文件:math.h
注:abs () 函数在 stdlib.h 里
原型 | double pow(double a, double b); | 指数函数 |
---|---|---|
- | double sqrt(double x); | 开平方 |
- | double ceil(double x); | 上取整 |
- | 返回的还是 double,因为 double 能够表示超出 int 的范围的数 | |
- | double floor(double x); | 下取整 |
- | int abs(int x); | 整数绝对值;stdlib.h |
- | doublefabs(double x); | 实数绝对值;f 也许在以前代表 float |
- | double log(double x); | 以 e 为底的对数 |
- | double log10(double x); | 以 10 为底 |
- | 换底公式可以求以任何数为底的对数:log (2) 8 = log (8) /log (2) | |
- | double acos(double x); | 反余弦函数:arccos () |
返回值:角度的弧度值 ⭐π = acos(-1) |
随堂练习#
-
- double 类型的控制字符是 “% lf”
- scanf的控制字符必须与参数的类型对应,否则读不进
-
double x;
-
scanf 时一定要用 “% lf” 对应,不能用 “% f”,否则如下:
-
- printf 没有它严格,控制字符可以不和类型完全一样,应该是有类型转换
- 代码
-
- 巧妙地是用 pow,三分之一次方表示立方根
- ⭐1/ 3**.0** 而不可以是 1 / 3
- gcc 编译时要添加 math 库,加 - lm
-
-
-
-
- 注意 π 可以用 acos (-1) 得到更精确的表示
- 代码
- 先除后乘更安全,不容易溢出
亮点笔记#
- double 类型的控制字符是 “% lf”
- π 可以用 acos (-1) 得到更精确的表示
代码演示#
练习#
-
-
用异或做交换思路清奇,但其实并不推荐
- 只能用于整型,才能异或
- 速度并不比使用 temp 快
- 同一个变量之间 swap 就会变成 0:swap (a, a)
附加知识点#
- 运算符优先级 + 结合顺序表- 百度
- p-- 的运算顺序是 ①p 指向的地址 - 1,②再用取该地址的值
- (*p)-- 才是①先取 p 指向地址的变量值,再将变量的值 - 1
- p-- 的运算顺序是 ①p 指向的地址 - 1,②再用取该地址的值
- 异或规律
- a ^ a = 0;
- 0 ^ a = a;
- 可以在一个数字均出现两次的数组中找有且一个只出现一次的数字
- xshell 运行 C 语言不报 warning
- g++ *.cpp -Wall
- 使用该选项,允许发出 GCC 能够提供的所有有用的警告
- 也可以用 - W {warning} 来标记指定的警告。
-
- g++ *.cpp -Wall
思考点#
- 用异或运算进行变量交换有什么好处?
- 节约第三方变量的内存
- 原理思考
- 逆运算即可
- 或者
- 自身与自身异或为 0
* 任何变量和 0 异或值不变 - 按上面的原理思考,其实也可以用 +- 运算来做?
- a' = a + b
- b = a' - b = a
- a = a' - b = a' - a = b
- 但是这样做并没有用到位运算的高效性,而且要保证两个数的和不溢出~
Tips#
-
C 语言文档中文版- 极客学院翻译
- C 语言大约有 29 个函数库
-
参考工具书章节
-