1. if语句
1.1 基础概念
cpp
if (表达式)
语句;
当表达式成立(为真)时,则语句执⾏,当表达式不成立(为假)时,则语句不执⾏.
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
接下来看一个例子: 输入一个整数,判断这个数是否为奇数
cpp
#include <stdio.h>
int main(void)
{
int n == 0;
scanf("%d",&n);
if(n % 2 == 1) //余数为1是奇数
printf("%d是一个奇数\n",n);
return 0;
}
这里有语句执行的概念图:

1.2 else
如果一个问题只有两种情况,非黑即白,那么一种是if,那么另一种就是else了;如果有多重情况,将可列举的列举后,剩下的也就是else(可类比后面switch语句中的default,加强记忆).
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这⾥就需 if ... else ...语句,语法形式如下:
cpp
if ( 表达式 )
语句1;
else
语句2;
来看示例:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
cpp
#include <stdio.h>
int main(void)
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
一个整数,不是奇数就是偶数,如果判断if判断num为奇数,就直接执行if里的语句,否则就执行else里的语句.
练习: 输⼊⼀个年龄,>=18岁就输出:成年,否则就输出:未成年
cpp
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
同上.
1.3 分支中包含多条语句
默认在 if 和 else 语句中默认都只控制⼀条语句,如果没有大括号的话就最多只能控制一条语句.
⽐如:
cpp
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n"); //这里想让后面的两个语句都受if管理
printf("可以学习编程了\n");
return 0;
}
上⾯的代码,你会发现输⼊的age值不管是大于等于18 还是小于18,"可以学习编程了"都会被打印在屏幕上.


这显然回应不了我们的需求,这是为什么呢?
这是因为 if 语句只能控制在其后面的⼀条语句,就是 printf(" 成年了 \n"); ,if语句为真,则打印成年了, if语句为假,则不打印"成年了".
而对于 printf(" 可以学习编程了 \n"); 是独⽴于if语句存在的,不管if语句的条件是真还是假,这条语句都会被执⾏。那如果我们要if语句同时控制两条或多条语句.
该怎么办呢?那就要使⽤大括号{ }将想被if控制的所有语句括起来, 当然else 后也可以跟上⼤括号来起到相同作用。
如下:
cpp
int main(void)
{
int age = 0;
scanf("%d",&age);
if(age >= 18) //两个语句都被同一个大括号包括
{
printf("成年了\n");
printf("可以学习编程了\n");
}
else
{
printf("未成年\n");
printf("当然也可以学习编程\n");
}
return 0;
}
1.4 嵌套if
在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断,也就是之后要说到的选择.
示例比如:要求输入一个整数,判断其是0,还是正数抑或是负数
代码如下:
cpp
int main(void)
{
int num = 0;
scanf("%d",&num);
if(num == 0)
{
printf("输入的数字是零\n");
}
else if(num > 0)
{
printf("输入的数字是正数\n");
}
else
{
printf("输入的数字是负数\n");
}
return 0;
}
下图中的红圈里代码就是嵌套在前⾯的 else ⼦句中的,也就是在前一个else包含的范围内再进行条件判断,构成了嵌套的if语句。

对于这里有些不理解的同学,我画了一张图来表达它的大体结构,可能会利于您理解,请看:

为了方便理解,接下来我们用一种最清晰的结构写一下上面的代码: 输⼊⼀个整数,如果不是正数则输出:非负数.如果是正数,再判断是奇数还是偶数,并输出;
cpp
int main(void)
{
int num = 0;
scanf("%d",&num);
if(num < 0)
{
printf("非正数\n");
}
else
{
if(n % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n")
}
}
return 0;
}
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断.
练习:
cpp
输⼊⼀个⼈的年龄:
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁及以上打印"⽼寿星"
这里给到参考代码:
cpp
//⽅法1
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age < 18)
printf("⻘年\n");
else if(age <= 44)
printf("少年\n");
else if(age <= 59)
printf("中⽼年\n");
else if(age <= 89)
printf("⽼年\n");
else
printf("⽼寿星\n");
return 0;
}
cpp
//方法二: 更加清晰的逻辑
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age < 18)
{
printf("少年\n");
}
else
{
if(age <= 44)
{
printf("⻘年\n");
}
else
{
if(age <= 59)
{
printf("中⽼年\n");
}
else
{
if(age <= 89)
printf("⽼年\n");
else
printf("⽼寿星\n");
}
}
}
return 0;
}
这里能很清晰的看出来else if嵌套语句就是在前一个else的范围内再做一个if..else条件语句.
1.5悬空else问题
如果有多个 if 和 else ,可以记住这样⼀条规则:else 总是跟最接近的 if 匹配。 我们⾸先从下⾯代码开始.
cpp
include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
程序运⾏的结果是啥?
很多初学者,上来以判断 a 是0,不等于1,那就执⾏else 子语句,打印haha呗.
但是当你去运⾏代码,结果是:没有任何输出结果

为什么呢?
这就是悬空 else 的问题,如果有多个if 和 else ,可以记住这样一条规则:else总是跟最接近的if匹配。
上⾯的代码排版,让我们以为语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印其中的内容,但是这个else是与第二个if语句绑定的,而这里被绑定在一起的if...else语句被包含于第一个if语句中,这样当第一个if语句中的a == 1,判断为假是,就不对进来执行第一个if内部的语句,也就什么都不会打印.
如果代码改成下⾯这样就更加容易理解:
cpp
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
或者如果我们希望else确实和第⼀个if匹配,可以这样修改代码:
cpp
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0
}
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。