
4.2.1 if语句的三种形式
if语句有三种形式,分别来看一看。

图4.2 if语句第一种形式的执行流程图
(1)if (判断表达式)语句;
含义:如果判断表达式中的条件满足则执行对应的语句(1条或多条语句),否则直接跳过这些语句继续执行后面的内容。注意,if后面是个圆括号,通俗地说就是用圆括号把这个判断表达式括起来。这种形式的if语句执行流程如图4.2所示。
看看如下范例:

如果想在条件满足时执行多条语句,则必须用{}构成复合语句。注意,C语言中的每条语句后面是用分号结尾的,但{}后面没有分号。看看如下范例:

如果不用{},会产生什么结果,读者可以设置断点跟踪观察程序的执行流程:

如果不用{},则不管x的值是否大于5,后面这行printf语句一定会被执行,因为后面这行printf语句已经不是if语句在条件成立时所要执行的语句范围之内的语句了,所以,请记住,如果不使用{}将要执行的语句括起来,那么if语句在条件成立时只会执行if后面第一次遇到分号之前所涵盖到的那些语句。
(2)if(判断表达式)语句1;else语句2;
含义:如果判断表达式中的条件满足,则执行语句1(1条或多条语句),否则执行语句2(1条或多条语句)。这种形式的if语句执行流程如图4.3所示。

图4.3 if语句第二种形式的执行流程图
看看如下范例:

如果想在条件满足或者不满足时执行多条语句,则必须用{}构成复合语句。看看如下范例:

如下演示包含语法错误,因为if语句中没有用到{}括起来多个语句让它们成为复合语句,这样会造成if和else中间夹杂了一个本不应该出现的printf语句(下面代码从上往下数第二个printf语句),从而导致语法错误:

(3)if(判断表达式1)语句1;

含义:如果判断表达式1成立,则执行语句1,否则看判断表达式2是否满足条件,如果判断表达式2成立,则执行语句2,否则看判断表达式3是否满足条件……如果表达式m成立,则执行语句m,如果判断表达式1~m都不成立,则执行语句n。这种形式的if语句执行流程如图4.4所示。

图4.4 第三种形式的if语句执行流程图
看看如下范例:

当然,最后一个else可以省略,如果省略了,并且所有的if条件(判断表达式)都不成立,那么这条if语句就不会执行任何代码(因为这些代码都是在某个条件成立时才会去执行)。
针对以上三种形式的if语句,有两点说明:
(1)三种if语句后面都有“判断表达式”,这个判断表达式一般为逻辑表达式或者关系表达式。回忆一下前面所讲的逻辑表达或者关系表达式,形式可能会像下面这样:

这里系统对判断表达式的值进行了判断,可以扩展一下:如果判断表达式的值为0,则按“假”处理;如果判断表达式的值为非0,则按“真”处理。看如下代码:

判断表达式的类型不限于关系表达式和逻辑表达式以及整型数字,还可以是任意的数值类型,如实型、字符型等,虽然语法上这样用没有问题,但一般不会这样用。举例如下:

(2)if语句可以单独使用,但else语句不能单独使用,必须与if语句配对使用,也就是说,如果出现了else,必然会对应一个if语句。