C语言If和Else合用的用法
If 语句有两种结构:
1. If ( Condition )
一条语句/复合语句
2. If ( Condition )
一条语句/复合语句
Else
一条语句/复合语句
其中,第一种结构我们前面已经讲过了。现在我们来讲第二种结构的用法。
首先,请思考一个简单问题:编写程序读取用户输入的整数,如果用户输入不为零,则输出其值;如果用户输入等于零,则提示用户不要输入零。
如果我们只知道 If 语句的第一种结构,可以这么写:
Scanf("%D", &Num);
If (Num) // 和 If (Num != 0) 效果相同
{
Printf("Non-Zero Integer: %D
", Num);
}
If (Num == 0)
{ // 输出提示
Printf("Zero Is Not Allowed!
");
}
而使用 If 语句的第二种结构,我们可以这么写:
Scanf("%D", &Num);
If (Num)
{
Printf("Non-Zero Integer: %D
", Num);
}
Else
{ // 输出提示
Printf("Zero Is Not Allowed!
");
}
这段代码的执行流程为:
1. 如果 Num 不等于 0 ,则输出其值,而 Else 后面的“一条语句/复合语句”则会被跳过。
2. 如果 Num 等于 0,立刻执行 Else 后面的语句(即输出提示)。
而第一种写法的执行流程为:
1. 如果 Num 不为零,则输出其值。至此,第一个 If 语句执行完毕。接着执行第二个 If
语句,判断 Num 是否为零,因为 Num 不为零,故跳过其后的“一条语句/复合语句”,
也就是不输出提示。第二个 If 语句至此也结束了。
2. 如果 Num 等于 0,第一个 If 语句就此执行完毕,接着执行第二个 If 语句,判断 Num
是否为 0,然后才输出提示。
由此可见,使用第一种方法,无论 Num 是否为 0,都需要对其进行两次判断,而且第二次判断根本是没必要的,因为如果 Num 为真,则肯定不是零,如果 Num 为假,则肯定是零;第二种方法仅需对 Num 进行一次判断,故其效率较第一种要高。第一种方法使用了两条 If 语句,而第二种方法仅使用了一条。整个 If Else 结构只算是一条语句。
If 语句的第一种结构使我们可以选择是否执行某条语句/复合语句,而第二种结构使我们可以在两条语句/复合语句中选择其中一条来执行。
如果你需要在 If 和 Else 之间执行多条语句,必须用大括号把这些语句括住,也就是说,必须使用复合语句。例如,以下代码是错误的:
If ( Condition )
Printf("Good
");
++Condition;
Else
--Condition;
If 和 Else 之间只能有一条语句,无论是否复合语句。这么写才是对的:
If ( Condition )
{
Printf("Good
");
++Condition;
}
Else
--Condition;
注意:Else 是和离它最近且未和任何 Else 配对的 If 进行配对的,和代码的缩进无关。缩进的作用只是使代码富有层次感,美观易读,对目标代码的生成毫无影响。例如:
#Define NUM 1
#Define BER 2
If ( NUM == 1 )
If ( BER == 2 )
Printf("Good!
");
Else
Printf("Too Bad!
");
乍一看,很多人可能都会以为这段代码中的 Else 是和 If ( NUM == 1 ) 配对的。其实不然!如果 NUM 不为 1,根本不会执行 Else 后面的语句。这段代码中的 Else 是和 If ( BER == 2 ) 配对的。如果 NUM 等于 1 并且 BER 不为 2,才会执行 Else 后面的语句。
由此可见,编写代码时,缩进非常重要。好的编程风格可以帮助我们理解代码的含义,而差的编程风格却往往造成严重的误导。改成这样会易读很多:
If ( NUM == 1 )
If ( BER == 2 )
Printf("Good!
");
Else
Printf("Too Bad!
");
如果你的确希望 Else 和 If ( NUM == 1 ) 配对,则要这么写:
If ( NUM == 1 )
{
If ( BER == 2 )
Printf("Good!
");
}
Else
Printf("Too Bad!
");
此时,虽然 If ( BER == 2 ) 离 Else 最近,而且的确还没有和任何 Else 配对,但是,由于其位于复合语句里面,而 Else 却在复合语句外面,所以 Else 不能和它配对。 |