if else
if-else 用于根据条件执行不同的语句。
语法
if (condition) 语句1
:如果condition
不等于0
,执行语句1
。if (condition) 语句1 else 语句2
:如果condition
不等于0
,执行语句1
;否则,执行语句2
。
其中的 condition
是标量类型的表达式(毕竟要和整数 0
做比较);语句1
和 语句2
可以是任意语句,包括其他的 if-else
语句。也就是说,if-else
语句可以嵌套使用,如下所示:
c
if (condition1)
if(condition2)
语句1
else
语句2
else if (condition3)
if (condition4)
语句3
else
语句4
else 语句5
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
在上面的代码中:
- 如果
condition1
不等于0
:- 如果
condition2
不等于0
,执行语句1
; - 否则,执行
语句2
。
- 如果
- 如果
condition1
等于0
:- 如果
condition3
不等于0
:- 如果
condition4
不等于0
,执行语句3
; - 否则,执行
语句4
。
- 如果
- 否则,执行
语句5
。
- 如果
在大多数情况下,满足某个条件时需要执行的语句多于一个,此时 if
和 else
后面可以跟随一条复合语句(用大括号包裹的语句和声明序列)。即使满足某个条件时只需执行一条表达式语句,也建议使用大括号将其包裹,使其使用复合语句:这样不仅容易阅读,而且方便后续的扩展。如下所示:
c
if (condition) {
语句1
语句2
} else if (condition){
语句3
语句4
} else {
语句5
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
不包裹大括号可能出现什么?
假如我有如下功能:当角色生命值等于 0
时,将角色的状态设置为死亡。如果不使用大括号包裹,我可能会写出这样的代码:
c
if (hp == 0)
state = PLAYER_DEAD;
if ( /* 其他条件 */ )
// 其他代码
1
2
3
4
2
3
4
现在,如果我想增加功能:在角色死亡后,打印一条消息。那么我可能会这样写:
c
if (hp == 0)
state = PLAYER_DEAD;
printf("角色死亡\n");
if ( /* 其他条件 */ )
// 其他代码
1
2
3
4
5
2
3
4
5
但是,当运行的时候,我会发现,无论角色生命值是否等于 0,都会打印消息。这是因为,if
语句只会包含其后的第一条语句,即 state = PLAYER_DEAD;
,因此即使角色生命值不等于 0,printf("角色死亡\n");
也会被执行。
为了避免这种情况,建议永远使用大括号包裹 if
之后的语句,使之成为复合语句,如下所示:
c
if (hp == 0) {
state = PLAYER_DEAD;
}
if ( /* 其他条件 */ ) {
// 其他代码
}
1
2
3
4
5
6
2
3
4
5
6
这样的话,扩展功能之后,就不会影响到原来的代码了:
c
if (hp == 0) {
state = PLAYER_DEAD;
printf("角色死亡\n");
}
if ( /* 其他条件 */ )
// 其他代码
1
2
3
4
5
6
2
3
4
5
6