C程序设计语言现代方法05:选择语句
目录
1. C语言语句分类
2. 逻辑表达式
2.1 == 与 =
2.2 &&和||的短路特性
2.3 不要将==用于浮点数判断
3. if语句
4. 条件表达式
5. switch语句
6. C语言中的布尔值
6.1 C89没有专门的布尔类型
6.2 C99提供了_Bool类型
1. C语言语句分类
① 表达式语句
② 选择语句
类型:if 语句(可带有子句)、switch 语句
作用:允许程序在一组可选项中选择一条特定的执行路径
③ 重复语句
类型:while 语句、do-while 语句、for 语句
作用:重复(循环)操作
④ 跳转语句
类型:break 语句、continue 语句、goto 语句、return 语句
作用:导致无条件地跳转到程序中的某个位置
⑤ 符合语句(花括号)
a. 通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句来处理
b. 复合语句出现在需要多条语句但C语言的语法却要求一条语句的地方
⑥ 空语句
; // 这就是一条空语句~
⑦ 函数调用语句
说明:选择语句、重复语句和跳转语句可统称为流程控制语句
2. 逻辑表达式
2.1 == 与 =
if (i == 0)
if (0 == i)
目的:避免将==写成=的错误,这种技巧只能在判定条件中的一个操作数不是左值时才有用(个人并不推荐如此使用,都已经想到要交换操作数顺序了,还能把==写成=吗)
注:GCC编译器中使用编译选项-Wparenthess或-Wall可以检测出if 条件中=运算符的可疑使用。GCC允许程序员通过在if 条件外面增加一对括号的方式来抑制该警告,
if ((i = j))
2.2 &&和||的短路特性
如果表达式的值可以仅由左操作数的值推导出来,那么将不再计算右操作数的值(如果右操作数有副作用,则该副作用并不会发生)
示例:
i = 1; j = 1; k = 1;printf("%d", ++i || ++j && ++k); // 1
printf("%d %d %d\n", i, j, k); // 2 1 1
2.3 不要将==用于浮点数判断
由于浮点数的存储格式,其存储的是一个浮点数的近似值(学过数值分析就知道),所以不要直接使用==运算符判断两个浮点数是否相等
可以设定一个允许的误差值,当两个浮点数相减结果的绝对值在这个误差范围内时,我们就认为两个浮点数相等
#define EPSILON 0.00001
double a;
double b;if ((-EPSILON < (a - b)) && (a - b) < EPSILON)return true;
3. if语句
if (表达式) // if语句通过测试表达式的值从两个选项中选择一个语句 // 一条语句
else // else子句可选语句 // 一条语句
说明1:以上两个语句均为一条语句,如需多条语句应当使用复合语句{}
说明2:else子句配对规则
属于离他最近的且还未和其他else子句匹配的if 语句
说明3:if语句嵌套形式
// 嵌套的if语句
if (表达式)
{if (表达式)语句else语句
}
else
{if (表达式)语句else语句
}
// 级联式if语句
if (表达式)语句
else if (表达式)语句
else语句
上面2种if语句构成的判断树如下,
① 级联式if 语句特别适合描述数轴(本质上是判定一系列的条件,一旦其中某个条件为真就立刻停止)
② 级联式if 语句本质上还是内嵌式if 语句,只不过都是内嵌在else子句中
4. 条件表达式
表达式1 ? 表达式2 : 表达式3
计算步骤:首先计算出表达式1的值,如果此值不为零,那么计算表达式2的值,并且计算出的值就是整个条件表达式的值;如果表达式1的值为零,那么表达式3的值就是整个条件表达式的值
注意:上述所有表达式的值都是包含类型的,尤其要注意混合类型。如果i 是int型,d 是double型,那么条件表达式(i > 0 ? i : d)的类型为double型。如果i > 0为真,那么变量i 的值转化为double型后的值就是表达式的值
本质上是隐式类型转换的一种,即当算术表达式或逻辑表达式中操作数类型不同时的类型转换
int i = 10;
double d = 10.1;printf("%d\n", sizeof(i > 0 ? i : d)); //输出为8,可见经过了类型转换
5. switch语句
应用场景:把表达式的值和一系列值进行比较
switch (表达式) // 该表达式的类型必须是整型(C语言中字符型也视为整型)
{case 常量表达式: 语句...case 常量表达式: 语句default: 语句 // default分支可选
}
说明1:case 常量表达式
① case 常量表达式称为分支标号,是基于计算跳转的入口。分支标号不能重复,但对顺序没有要求,多个分支标号可以共用一组执行语句
② 此处的常量表达式有2个要求,
a. 不能包含变量和函数调用(常量就是在程序运行前就已确定的量,即编译时可确定的量)
b. 必须为整型,包括字符型
说明2:case语句
① case语句通常最后为break语句,如果多分支共享语句,故意省略break,应该注释说明
② 虽然switch语句中的最后一个分支不需要break语句,但通常还是会放一个break语句在那里,以防止将来增加分支数目时出现丢失break的问题
说明3:if语句和switch语句的语义区别
① if 语句表达某个条件满足或不满足(本质上就是二分支)
② switch语句表达根据同一测试条件的不同状态做出选择
6. C语言中的布尔值
6.1 C89没有专门的布尔类型
#define BOOL int
#define TRUE 1
#define FALSE 0BOOL flag; //定义"布尔"变量
if (flag) //判断flag为真
if (!flag) //判断flag为假
说明1:还可以用类型定义(typedef)和枚举完善上述方法,枚举类型的好处是将合法值限定为0和1
说明2:C89中枚举类型变量赋值问题
结果:会有警告,但可以运行并打印结果。可见C89对枚举类型变量的类型安全保护不足
6.2 C99提供了_Bool类型
本质上是无符号整型,但只能赋值为0或1。如果向_Bool变量中存储其他非零值会导致变量赋值为1
进一步,C99提供了头文件<stdbool.h>,该头文件定义了宏bool、true和false
bool flag;
flag = true;
flag = false;
说明:由于C99标准没有被广泛执行,使用该特性可能会影响程序的可移植性
C程序设计语言现代方法05:选择语句相关推荐
- C语言排序方法-----二元选择排序法
上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比 ...
- C程序设计语言现代方法02:C语言基本概念
目录 1. C语言程序的编译与链接 1.1 预处理 1.2 编译 1.3 链接 2. 简单C程序的一般形式 2.1 预处理指令 2.2 语句 2.3 函数 2.4 注释 3. 变量与赋值 3.1 类型 ...
- C程序设计语言现代方法07:基本类型
目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...
- C程序设计语言现代方法18:声明
目录 1. 声明的语法 2. 变量的性质 2.1 变量性质的构成 2.2 变量默认性质 2.3 修改变量默认性质 2.3.1 修改局部变量默认性质 2.3.2 修改全局变量默认性质 2.4 exter ...
- C程序设计语言现代方法17:指针的高级应用
目录 1. 动态存储分配 1.1 malloc函数 1.2 calloc函数 1.3 realloc函数 1.4 free函数 2. 空指针NULL解析 2.1 NULL的定义形式 2.2 程序如何知 ...
- C程序设计语言现代方法14:预处理器
目录 1. 预处理器工作原理 1.1 预处理器性质 1.2 预处理器主要功能 1.3 GCC编译过程及常用选项 1.3.1 GCC编译过程 1.3.2 编译选项实例 1.4 注意事项 2. 预处理指令 ...
- C程序设计语言现代方法13:字符串
目录 1. 字符串字面量 1.1 定义 1.2 字符串字面量包含转义序列 1.3 延续字符串字面量 1.3.1 使用续行符 1.3.2 仅用空白字符分割字符串字面量 1.4 存储字符串字面量 1.5 ...
- C程序设计语言现代方法12:指针和数组
目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...
- C程序设计语言现代方法09:函数
目录 1. 函数的定义和调用 1.1 函数定义格式 1.2 函数调用 2. 函数声明 2.1 实际参数的类型转换 2.1.1 编译器在调用前遇到函数原型 2.1.2 编译器在调用前没有遇到函数原型 2 ...
最新文章
- Android 中文 API —— TextSwitcher
- 系统架构师 项目经理 哪个更有前景_中央空调加地暖与五恒系统,哪个更省钱?...
- c#中ReadLine,Read,ReadKey的区别
- 关于DataAdapter打开和关闭连接
- 【HTML5】HTML5支持的通用属性
- TransH:将知识嵌入到超平面(知识图谱嵌入)2014 AAAI
- pythonfor循环加2_初中生教你编程---python(for循环)part 2
- 19 Signals and Signal Handling
- Django常用代码基本语句
- Seq2Seq中的Attention
- SQL 模糊表名查询
- “rt.jar is not on its project's build path”
- html的选择字体样式代码,html 常用字体(示例代码)
- autoconfig
- Android阿里云推送
- part-15 开环增益Avol
- P3717 [AHOI2017初中组]cover
- 如何修改网易邮箱大师电脑端的消息提示音?超简单
- 四、LockSupport与线程中断
- Mac电脑上的精美的壁纸 Pap.er
热门文章
- windows php fastcgi,windows下FastCGI(php-cgi)的工作原理和配置
- 交叉驰豫的影响因素_墨点对uv打印机印刷质量影响
- python批量处理excel数据_Python批量处理Excel,真香(超实用!)
- payload的使 常用xss_Sony某个深度子域上的XSS
- 从此,懂一点CDMA
- Python中TypeError: ‘str‘ object is not callable
- 启动go服务_使用Go构建TCP并发服务器,这种方式原来这么简单
- python n个list如何组成矩阵_python和c++通信示例
- html里面css什么意思,Web前端
- html css表格样式模板_Excel报价单模板,完整表格设计,82套多样式选择,拿来就用...