Loading... 4.1 表达式与单步调试 ============ 表达式 --- 需先认识几个术语: 表达式 `Expression` : 如 `(a + 10 ) * b` 操作符 `Operator` : 如 `+ - * /` 操作数 `Operand` : 即表达式里的数值或变量 表达式的值: ------ 将所有变量的值代入表达式,计算所得的结果 - 表达式都有一个值 - 这个值有一个类型,可能是 int, double, bool 等 例如, int a = 10; int b = a +10; 单步调试 ---- 程序是一步一步执行的,通过单步调试,可以观察每一步的结果 1. 添加断点 ( 断点, Breakpoint ) 2. 点 F5 开始调试 ( 调试, Debug ) 3. 点 F10 单步执行, 观察局部变量窗口中的值 4. 停止调试 注:菜单“调试 | 窗口 | 局部变量” 打开局部变量窗口 小结: 单步调试是必须掌握的技术 4.2 算术操作符 ========= 算术操作符 ----- 以下5个操作符,用于实现算术运算 | 操作符 | 名称 | | :----: | :----: | | + | 加 | | - | 减 | | * | 乘 | | / | 除 | | % | 模 | 整型的算术运算 ------- 以下式子中,a,b为`int`型 `a + b` 求和 `a - b` 求差 `a * b` 求积 `a / b` 求商 `a % b` 求余 两个`int`型在算术运算后,结果仍为`int`型 整数的除运算:求商,不保留小数 int result = 14 / 5; 小数的模运算:求余 int result = 14 % 5; 根据小学算术: `14 = 5 * 2 + 4` ,所以余数为4 浮点型的算术运算 -------- 小数的除运算:求商,保留小数 double result = 14.0 / 5.0; 小数的模运算:不支持! double result = 14.0 % 5.0; // 语法错! 区分 -- 以下式子的结果为什么不同? int a = 14 / 5; // int / int double b = 14.0 / 5.0; // double /double 注:编译器把 14认作 `int`,把14.0认作`double`! 演示:单步调试 , 在监视窗口里测试查看 ... 类型提升 ---- 那么,以下式子又怎么计算? 14.2 / 5 类型提升:`double`与`int`混合运算时,把`int`提升为`double` 小结 -- 介绍了算术运算符 - 除法的规则 ( 整数除法) - 模运算的规则 - 调试状态下,监视窗口的运用 4.3 赋值操作符 ========= 在C语言里,等号称为 赋值操作符。 例如: a = b + 2; 分两步计算: ① 先计算等号右侧的表达式的值 ② 再把右侧的值赋给左边的变量 理解以下运算: int a = 10; a = a + 3; 按照赋值的运算规则: (1) 先求得右侧 a+3 的值为13 (2) 再把右侧的值给左侧的变量,最后a的值为13 组合赋值操作符 ------- 赋值操作符可以和其他操作符组合起来使用。例如, a += b; a -= b; a *= b; // a = a * b a /= b; a %= b; 规则都是一样的,相当于: a = a + b; 常见问题 ---- 1 不要分开写 a += b ; 其中,+= 必须连在一起,中间不能加空格 2 左侧必须是变量 3 = a + 4; // 这是个啥? 注意,编程不是数学! 3区分初始化和赋值 int a = 1; // 初始化 a = 123; // 赋值 这只是叫法上的不同,了解一下就行 在定义式中的等号叫初始化。其它式子中叫赋值。 小结 -- 学习了赋值操作符的用法 赋值:即修改变量的值 a = b + 10 a = a + b a += b 4.4 关系操作符 ========= 以下6个操作符,用于比较数值的大小关系 | 操作符 | 名称 | | :----: | :----: | | < | 小于 | | <= | 小于等于 | | > | 大于 | | >= | 大于或等于 | | == | 等于 | | != | 不等于 | 关系表达式的值为bool类型 -------------- 例如: int a = 10 ; int b = 4; bool result = a > b; 常见问题 ---- (1) 使用`bool`时,要 `#include <stdbool.h>` (2) 操作符是一个整体,中间不能加空格 例如 `>=` `<=` `==` `!=` (3) 对于初学者来说,`==` 不要写成 `=` 编程并不是数学,不要把数学的习惯带过来 小结 -- - 介绍了关系操作符的用法 - 本章目标:给出一个表达式,能口算出它的值 4.5 逻辑操作符 ========= 以下3个操作符,用于表示:并且、或者、非 | 操作符 | 名称 | 描述 | | :----: | :----: | :----: | | && | 逻辑与 | 并且 | | ‖ | 逻辑或 | 或者 | | ! | 逻辑非 | 非 | 逻辑与 --- 形如: `a && b` 其中,a 和 b为`bool`类型 规则:a为`true`并且b为`true`,结果为`true`; 否则,结果为`false` 逻辑或 --- 形如: `a || b` 其中,a 和 b为`bool`类型 规则:a为`true`或者b为`true`,结果为`true`; 否则,结果为`false` 逻辑非 --- 形如: `! a` 其中,a 是 `bool`类型 规则:a为`true`,!a 为`false`; a为`false`,`!a` 为`true` 常见问题 ---- 1. 操作符是一个整体,中间不能加空格 例如 `&&` `||` (需要两个操作数的运算符,称为 双目操作符 ) 2. 操作符与操作数之间,可以加空格 比如 '!k' '! k' 也可以 (只有一个操作数的运算符,称为 单目操作符 ) 小结 -- 介绍了逻辑操作符的用法 本章目标:给出一个表达式,能口算出它的值。 4.6 自增操作符 ========= 在C语言里,`++` 称为自增操作符。 例: int a = 10; a ++ ; 其作用是对a的值增加1 可理解为 `a = a + 1`; (效果不完全等同) 示例代码: int a = 10; int b = a++; printf("%d, %d ", a, b); 前置自增: `int b = ++a;` 后置自增: `int b = a++;` 前置自增:先自增,后运算 ------------ int b = ++a; printf("%d, %d ", a, b); 相当于: a = a + 1; 后置自增:先运算,后自增 ------------ int b = a++; printf("%d, %d ", a, b); 相当于: int b = a; a = a + 1; printf("%d, %d ", a, b); int b = a; printf("%d, %d ", a, b); 注意事项 ---- 1. 前置和后置是各种考试的常见考题 2. 但实际工程应用中,不会写这么复杂 ( 可读性差 ) int b = 10 + a++; 建议写成2行: int b = 10 + a; a += 1; 小结 -- 介绍了自增操作符 ++ 同理,还有自减操作符 -- 能够识别以下用法即可: int a = 10; int b = 5 + ++a; 4.7 优先级 ======= 当一个表达式时包含多种操作符时,需考虑操作符的优先级:谁先运算,谁后运算 示例:以下表达式的值是多少 10 + 4 * 2 显然,* 比 + 的优先级高,所以相当于 ( 10 + ( 4 * 2 )) 要点: 1. 记住常见的优先级顺序 2. 不确定的时候,强制加上小括号,来指定优先顺序 (( a + 11 ) > 20 ) && ( c < 4 ) 常见的优先级 ------ 1. 乘除法 → 加减法 a + b * c 2. 算术 → 关系 → 逻辑 a + 11 > b && c != d 小结 -- 介绍了操作符的优先级 在不确定优先级顺序时,积极使用小括号! 4.8 类型转换与提升 =========== 类型转换 ---- 观察以下的式子: double a = (double) 10; 1. 赋值符的左右两侧类型必须相同 2. 如果不同,需要作类型转换 其中,把 () 称为: 类型转换操作符 **类型转换 double ↔ int** 小数与整数的转换: 示例: double a = (double) 10; // 顺理成章的 int b = (int) 8.9; // 存在精度损失! 注意:小数转整数时,小数部分截断,**不是四舍五入**! (int) 8.9 的值是 8! 隐式转换:表示自然而然的,不存在损失的转换 示例: double a = (double)10; 其中,由于 int转成 double不存在数据损失,所以可以省略 (double) double a = 10; // 隐式转换! 相应的,另一处显式转换、或者叫强制转换! **类型转换 bool ↔ int** 在C语言里,bool与int是相通的,可以隐式转换 int => bool bool a = 1; // true bool b = -1; // true bool c = 2; // true bool d = 0; // false bool => int int e = true; // 1 int f = false; // 0 类型的提升 ----- 在混合运算时,int会自动提升为double 例如: 12.8 / 5 提升为 `12.8 / 5.0` 再运算 ( 4 + 3.8 ) * 2 提升为 `(4.0 + 3.8) * 2.0` 再运算 小结 - 赋值符两边的类型必须相同 - ( ) 叫做 类型转换操作符 - double转成int时,小数位截断,存在数据损失 - 隐式转换:自然而然的转换 - bool与int是相通的,非零整数是true, 零是false -- 最后修改:2020 年 10 月 31 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏