4. if语句
C语言中表示条件执行的最简单办法就是使用if语句,它有以下两种形式:
这个范例中的condition
部分是一个布尔表达式,语句部分可以是简单语句,也可以是程序块。
条件表达式为TRUE时所执行的程序块叫做if语句的then子句,条件为FALSE时执行的程序块叫做else子句。
- 悬空else问题(dangling-else problem)
由于if语句中的else子句是可有可无的, 所以有时会造成歧义,这种情况叫做悬空else问题。
消除悬空else问题:在if语句中使用程序块
if/else分块规则 - 对任何需要多行或需要else子句的if语句来说,都应该用大括号将在if语句控制下的各个独立的程序块括起来。
if语句必以如下四种形式之一出现:
(1) 单行if语句:条件极短。
(2) 多行if语句:语句被划分为一个程序块。
(3) if-else语句:将受控于if语句的语句划分为两个程序块,哪怕每块只有一条语句。
(4) 级联if语句:表达一系列的条件测试。
4.1 单行if语句
当if语句没有else子句,而主体部分只有一条简单语句,而且短得可以与if本身放在一行时,可以采用简单的单行if语句格式。
如:
if (value==Sentinel) break;
4.2 多行if语句
当if语句的主体有多条语句或有一条较长的语句使之不能与if放在一行时,这些语句将被划分为一个程序块。
4.3 if/else语句
为了避免悬空else问题,带有else子句的if语句主体将用大括号划分为两个程序块。
代码示例
#include <stdio.h>
/* Classify a number by its sign. */
main() {
int n;
printf("Which number? ");
scanf("%d", &n);
if (n > 0) {
printf("%d is positive.", n);
} else if (n == 0) {
printf("%d is zero.", n);
} else {
printf("%d is negative.", n);
};
}
4.4 级联if语句
当实际有两种以上情况时,if语句的一个十分重要而特殊的用法:
这种方式的特征在于if语句的else部分是由对另一个可选条件的测试构成的。
这样的语句叫做级联if语句(cascading if statement),它可以有任意个else if子句。
4.5 ?:运算符
?:
运算符在运用时分成两部分且带三个操作数。其一般形式为:
(condition) ? expression1 : expression2
首先计算条件值。
如果条件结果为TRUE
, 则计算expression1
的值,并将它作为整个表达式的值;
如果条件结果为FALSE
,则整个表达式的值为expression2
的值。
可以把?:
运算符看作以下if语句的缩略形式:
if (condition) {
value=expression1;
} else {
value=expression2;
};
其中,存储在变量value中的值即为整个?:
表达式的值。
例如,可以用?:
运算符将x
和y
中值较大的一个赋值给max
:
max = (x > y) ? x : y;
使用场景:
使用?:
运算符的一种最常见的情况是,调用printf进行输出时,输出结果可能因为某个条件而略有不同。
另一个例子就是用?:
运算符以自然语言方式输出布尔变量的值。如:
printf("errorFlag=%s\n",(errorFlag) ? "TRUE" : "FALSE");
参考
《C语言的科学和艺术》 —— 第4章 语句形式