目录

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:选择语句相关推荐

  1. C语言排序方法-----二元选择排序法

    上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比 ...

  2. C程序设计语言现代方法02:C语言基本概念

    目录 1. C语言程序的编译与链接 1.1 预处理 1.2 编译 1.3 链接 2. 简单C程序的一般形式 2.1 预处理指令 2.2 语句 2.3 函数 2.4 注释 3. 变量与赋值 3.1 类型 ...

  3. C程序设计语言现代方法07:基本类型

    目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...

  4. C程序设计语言现代方法18:声明

    目录 1. 声明的语法 2. 变量的性质 2.1 变量性质的构成 2.2 变量默认性质 2.3 修改变量默认性质 2.3.1 修改局部变量默认性质 2.3.2 修改全局变量默认性质 2.4 exter ...

  5. C程序设计语言现代方法17:指针的高级应用

    目录 1. 动态存储分配 1.1 malloc函数 1.2 calloc函数 1.3 realloc函数 1.4 free函数 2. 空指针NULL解析 2.1 NULL的定义形式 2.2 程序如何知 ...

  6. C程序设计语言现代方法14:预处理器

    目录 1. 预处理器工作原理 1.1 预处理器性质 1.2 预处理器主要功能 1.3 GCC编译过程及常用选项 1.3.1 GCC编译过程 1.3.2 编译选项实例 1.4 注意事项 2. 预处理指令 ...

  7. C程序设计语言现代方法13:字符串

    目录 1. 字符串字面量 1.1 定义 1.2 字符串字面量包含转义序列 1.3 延续字符串字面量 1.3.1 使用续行符 1.3.2 仅用空白字符分割字符串字面量 1.4 存储字符串字面量 1.5 ...

  8. C程序设计语言现代方法12:指针和数组

    目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...

  9. C程序设计语言现代方法09:函数

    目录 1. 函数的定义和调用 1.1 函数定义格式 1.2 函数调用 2. 函数声明 2.1 实际参数的类型转换 2.1.1 编译器在调用前遇到函数原型 2.1.2 编译器在调用前没有遇到函数原型 2 ...

最新文章

  1. Android 中文 API —— TextSwitcher
  2. 系统架构师 项目经理 哪个更有前景_中央空调加地暖与五恒系统,哪个更省钱?...
  3. c#中ReadLine,Read,ReadKey的区别
  4. 关于DataAdapter打开和关闭连接
  5. 【HTML5】HTML5支持的通用属性
  6. TransH:将知识嵌入到超平面(知识图谱嵌入)2014 AAAI
  7. pythonfor循环加2_初中生教你编程---python(for循环)part 2
  8. 19 Signals and Signal Handling
  9. Django常用代码基本语句
  10. Seq2Seq中的Attention
  11. SQL 模糊表名查询
  12. “rt.jar is not on its project's build path”
  13. html的选择字体样式代码,html 常用字体(示例代码)
  14. autoconfig
  15. Android阿里云推送
  16. part-15 开环增益Avol
  17. P3717 [AHOI2017初中组]cover
  18. 如何修改网易邮箱大师电脑端的消息提示音?超简单
  19. 四、LockSupport与线程中断
  20. Mac电脑上的精美的壁纸 Pap.er

热门文章

  1. windows php fastcgi,windows下FastCGI(php-cgi)的工作原理和配置
  2. 交叉驰豫的影响因素_墨点对uv打印机印刷质量影响
  3. python批量处理excel数据_Python批量处理Excel,真香(超实用!)
  4. payload的使 常用xss_Sony某个深度子域上的XSS
  5. 从此,懂一点CDMA
  6. Python中TypeError: ‘str‘ object is not callable
  7. 启动go服务_使用Go构建TCP并发服务器,这种方式原来这么简单
  8. python n个list如何组成矩阵_python和c++通信示例
  9. html里面css什么意思,Web前端
  10. html css表格样式模板_Excel报价单模板,完整表格设计,82套多样式选择,拿来就用...