悬空(Dangling)else问题 ●嵌套if语句可能引起悬空else问题: if(y!=0) 1f(xI=0) result x y; else printf("Error:y is equal to oIn"); ●缩进(indentation)提示else子句应该和外层if配对 ●但C遵循的规则是ese子句应该和最近的未配对f配对,因此上述 代码等价于: if (y !=0) 1f(x!=0) result x y; else printf("Error:y is equal to oln"); 16/68
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 悬空 (Dangling) else 问题 嵌套 if 语句可能引起悬空 else 问题: if (y != 0) if (x != 0) result = x / y; else printf(" Error : y i s equal to 0\n"); 缩进 (indentation) 提示 else 子句应该和外层 if 配对 但 C 遵循的规则是 else 子句应该和最近的未配对 if 配对,因此上述 代码等价于: if (y != 0) if (x != 0) result = x / y; else printf(" Error : y i s equal to 0\n"); 16 / 68
悬空else问题的解决 悬空lse问题可以通过外套花括号强行为代码分组来解决! if (y !=0) { if (x !=0) result x /y; } else printf("Error:y is equal to oIn"); 花括号的存在,使得其和内层f语句组成了一条复合语句,切断 了与外层else的联系! 17/68
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 悬空 else 问题的解决 悬空 else 问题可以通过外套花括号强行为代码分组来解决! if (y != 0) { if (x != 0) result = x / y; } else printf(" Error : y i s equal to 0\n"); 花括号的存在,使得其和内层 if 语句组成了一条复合语句,切断 了与外层 else 的联系! 17 / 68
条件表达式(Conditional Expressions) ·C的条件运算符使得表达式可以依据条件的不同选择不同的 结果值 ●条件运算符包含?和:两个符号,且必须同时使用,形式为: expr1 expr2:expr3 ·条件运算符的操作数可以是任何类型 ●expr1?epr2:expr3称为条件表达式 ·条件运算符需要3个操作数,因此是C中唯一一个三元运 算符(Ternary Operator) ●exprl?expr2:expr3应读作“"if exprl then expr2 else expr3" 。求值过程:先求值expr1,如果其值非0,求值expr2,并 将expr2的值作为条件表达式的结果;否则,求值expr3, 将expr3的结果作为表达式的结果 18/68
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 条件表达式 (Conditional Expressions) C 的条件运算符使得表达式可以依据条件的不同选择不同的 结果值 条件运算符包含? 和: 两个符号,且必须同时使用,形式为: expr1 ? expr2 : expr3 条件运算符的操作数可以是任何类型 expr1 ? expr2 : expr3 称为条件表达式 条件运算符需要 3 个操作数,因此是 C 中唯一一个三元运 算符 (Ternary Operator) expr1 ? expr2 : expr3 应读作 “if expr1 then expr2 else expr3" 求值过程:先求值 expr1,如果其值非 0,求值 expr2,并 将 expr2 的值作为条件表达式的结果;否则,求值 expr3, 将 expr3 的结果作为表达式的结果 18 / 68
条件表达式示例 ●条件表达式可部分代替f语句: int i,j,k; i=1; j=2; k=i>j7 i:j; /k is now 2*/ k=(i>=0?i:0)+j;/*k is now3*/ ●最后语句中的括号不可省略,因为条件运算符优先级比除赋值运算符 外的所有运算符低 。条件表达式使代码更简洁,但也更难懂,应适度运用 ●条件表达式经常用在return语句中:return i>j?i:j: ●条件表达式可用在printf中:printf("%d小n",i>j?i:j); ·预处理宏中也经常用到条件表达式 19/68
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 条件表达式示例 条件表达式可部分代替 if 语句: int i, j, k; i = 1; j = 2; k = i > j ? i : j; /∗ k i s now 2 ∗/ k = (i >= 0 ? i : 0) + j; /∗ k i s now 3 ∗/ 最后语句中的括号不可省略,因为条件运算符优先级比除赋值运算符 外的所有运算符低 条件表达式使代码更简洁,但也更难懂,应适度运用 条件表达式经常用在 return 语句中:return i > j ? i : j; 条件表达式可用在 printf 中:printf("%d\n", i > j ? i : j); 预处理宏中也经常用到条件表达式 19 / 68
f语句中的布尔类型 ●C89 ·C89中由于缺乏真正的布尔类型,一般用整数代替 o#define TRUE 1并且#define FALSE0 。测试为真时:if(fag==TRUE).·,或者if(fag).. 。测试为真时:if(ag==FALSE)..,或者if!fag).. ●C99 ·C99定义了真正的布尔类型Bool,包含<stdbool..h>后可使 用宏bool来等价表示(c++用bool) ·b0ol类型只能取值为1/0,可将其当整型对待 。头文件<stdbool..h>还定义了宏true和false,分别表示1/0 o 测试为真时:if(hag==true)..,或者f(hag).. ●测试为真时:if(hag==false)..,或者if(!fag).. 20/68
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if 语句中的布尔类型 C89 C89 中由于缺乏真正的布尔类型,一般用整数代替 #define TRUE 1 并且 #define FALSE 0 测试为真时:if(flag==TRUE) . . .,或者 if(flag) . . . 测试为真时:if(flag==FALSE) . . .,或者 if(!flag) . . . C99 C99 定义了真正的布尔类型 _Bool,包含 <stdbool.h> 后可使 用宏 bool 来等价表示 (c++ 用 bool) bool 类型只能取值为 1/0,可将其当整型对待 头文件 <stdbool.h> 还定义了宏 true 和 false,分别表示 1/0 测试为真时:if(flag==true) . . .,或者 if(flag) . . . 测试为真时:if(flag==false) . . .,或者 if(!flag) . . . 20 / 68