笔记整理自哈尔滨工业大学的MOOC课程:C语言程序设计精髓
第四章:分支控制
选择结构(分支结构):根据给定的判定条件,判断结果,并根据判断的结果来控制程序的流程
关系运算符与关系表达式
关系运算符的优先级和结合性
* 算术运算符 -> 关系运算符(算术运算符的优先级大于关系运算符的优先级)
关系表达式的值是一个逻辑值:true 或者 false
C语言中没有布尔类型用1表示true,0表示false
注:
布尔类型(C99)
* _Bool是C99新增的布尔类型。它一个无符号整数类型,只能储存0
(表示假)或1(表示真)。包含stdbool.c头文件后,可以用bool 表
示_Bool 。ture表示1,false表示0,让代码与C++兼容
* 判断表达式的真假
非0 即 true,0 即 false
逻辑运算符与逻辑表达式
逻辑运算符的优先级和结合性
* (优先级)逻辑非 > 算术运算符 > 关系运算符 > 逻辑与 > 逻辑或
* (结合性)
逻辑非——右结合
逻辑与,逻辑或——左结合
表示a>b>c:a > b && b > c
逻辑运算符的短路特性
若表达式的值可由先计算的左操作数的值单独推导出来,那么将不再计算有操作数的值
例:(a>=1)&&(b++==5) 若左边的表达式计算出来为false,则不再计算右边的表达式,即b++不会被执行,结果直接为false(0)
短路特性的应用:
使“除0”运算不会发生:(i != 0)&&(j / i >0)
选择结构分为:单分支、双分支、多分支
单分支选择结构
* 面临的选择是:要么执行一个操作,要么跳过它
* if 语句
双分支选择结构
* 面临的选择是:在两个不同的操作中选择其中的一个来执行
* if-else 语句
多分支选择结构
* 面临2种以上选择(需连续执行多个条件判断)时
* 级联式 if 语句:else-if
条件运算符和条件表达式
条件表达式:表达式1 ? 表达式2 : 表达式3(表达式1的值为true的话, 则表达式2的值为条件表达式的值;
表达式1的值为false的话,则表达式3的值为条件表达式的值)
复合语句:将一组逻辑上相关的语句用花括号括起来构成的语句
复合语句在逻辑上被当作一条语句看待
else语句总是和上面离它最近的 if 语句配对
开关语句(switch语句)
* switch语句中表达式的值一般为int,char
* case 后常量的类型应当与表达式值的类型一致
自动类型转换
* 赋值操作中,何时发生自动类型转换?
* 左侧(目标侧)与右侧类型不一致
* 自动类型转换的规则
变量 = 表达式;
类型2 <= 类型1
* 在不同类型数据间赋值,是安全的吗?
* 取值范围大的类型=>取值范围小的类型,通常是不安全的
* 可能会发生数值溢出
任何类型都只能用有限的位数来存储数据,表数范围有限。
如果向变量赋的值超出了其类型的表数范围,则会发生数值溢出
整数的数值溢出
如果运算结果超出了long所能表示的数的上界,则进位将到达最前面的符号位(0 => 1(即首位变为负数))
上溢出
* |一个数值运算结果| > |类型能表示的最大数|
* 进位超过最高位而发生进位丢失
* 或进位到达最高位而改变符号位
例:a为无符号短整型的最大值
%hu,输出无符号短整数
* 无符号整数的运算时要注意是否发生数值溢出
* 对于无符号数,不能随意用a-b<0取代a<b
浮点数的数值溢出
补充:是靠近0的正下溢、负下溢会被系统处理成机器0
自动类型转换
* 在不同类型数据间赋值时,会发生自动类型转换
* 取值范围大的类型=>取值范围小的类型,通常是不安全的
* 可能会产生数值溢出
* 可能会产生数值精度损失
有效数字:
从左边第一个非0的数字起,到精确到的位数为止,其间的所有数字
两个数量级相差很大的浮点数做加减运算时,数值小的数会受浮点数精度限制而被忽略