文章目录
助记提要
- 关系运算符、判等运算符、逻辑运算符的优先级和结合性;
- 条件运算符;
- C语言中如何使用布尔值;
- switch语句的注意;
- for语句省略表达式;
- 逗号表达式;
- goto语句;
- 空语句;
不应该以聪明才智和逻辑分析能力来评判程序员,而要看其分析问题是否全面。
5章 选择语句
5.1 逻辑表达式
选择语句必选先测试表达式的值是真还是假。
构建逻辑表达式的运算符有9个。
逻辑表达式的值只会是1(真)或0(假)。
-
关系运算符
大于>
、小于<
、大于等于>=
、小于等于<=
4个关系运算符都是左结合的,优先级低于算术运算符。注意
i < j < k
在C语言中是合法的,但是并不是检测j是否位于i和k之间。它先比较i<j
的值,然后用这个结果和k比较。 -
判等运算符
等于==
、不等于!=
判等运算符是左结合的,优先级低于关系运算符。
表达式i < j == j < k
,当i < j
和j < k
同为真或同为假时,表达式的值为真。
==
经常被误写为=
,有的时候编译器不会警告,导致程序出现错误。使用gcc编译C程序时可以指定-Wall
选项,强制编译器检查这类书写错误。程序员可以在if条件外面多加一层圆括号来禁用该警告:if ((i = j)) ...
-
逻辑运算符
非!
、与&&
、或||
!
是一元的右结合运算符,优先级和正负号相同。
&&
和||
是二元的左结合运算符,优先级低于判等运算符。运算符
&&
和||
都会进行短路计算:先计算出左操作数的值,然后计算右操作数。如果表达式的结果可以由左操作数推导出来,就不计算右操作数。注意 由于
&&
和||
的短路特性,有些运算不一定会发生,如:i > 0 && ++j > 0
,如果i不大于0,j的自增操作就不会发生。
5.2 if语句
语法
- 基本语法格式
if (表达式) 语句;
先计算表达式的值,表达式值非零,就执行圆括号后面的语句。
C语言中,非零值都为真。
- 复合语句
if (表达式){
语句1;
语句2;
...
}
花括号包起来的语句称为复合语句,它会强制编译器将一组语句做为一条语句来处理。
为语句添加花括号,可以使程序更易读。也可以更方便地向语句块中添加语句。
- else子句
if (表达式) 语句1; else 语句2;
if (表达式) {
语句11;
语句12
} else {
语句21;
语句22;
}
注意 else子句会归属于离它最近且还未和其他else匹配的if语句。
下面的这种写法,按缩进来理解,else应该属于外层的if语句,但是实际上它是属于内层的if语句的。这时最好把内层if语句使用花括号包起来。
if (y != 0)
if (x != 0)
result = x / y;
else
printf("Error: y == 0\n");
- 级联if语句
级联式if语句可以避免数量过多的内嵌if语句
if (表达式)
语句1;
else if (表达式)
语句2;
else
语句3;
级联式if语句不是新的语句类型,只是将另外一个if语句做为else字句。
条件运算符
条件运算符的作用类似if语句,它允许根据条件的结果,产生两个值中的一个。条件运算符构建的条件表达式语法如下:
表达式1 ? 表达式2 : 表达式3
如果表达式1成立,就计算表达式2的值做为条件表达式的结果,否则计算表达式3的值做为结果。
条件运算符是唯一的一个三元运算符。它的优先级低于所有的运算符。
条件表达式短小但是难以阅读,应该避免使用。但在少数地方使用会很方便:
// return语句使用
return i > j ? i : j
// printf函数使用
printf("%d\n", i > j ? i : j);
条件表达式i > 0 ? i : j
中,如果i是int
型,j是float
型,即使i > 0
为真,表达式的结果也是i转换后的float
型。
C语言中的布尔值
C89没有定义布尔类型,但是很多程序中需要变量存储真或假值。
程序员经常使用TRUE和FALSE这样的名字来定义宏:
#define TRUE 1