if在英文中的意思就是如果,在c语言中也表示类似的意思,“如果(怎么怎么样),就怎么怎么样”,代表着一种分支结构。为什么说是分支结构呢?因为如果有多个“如果”的话,那么每一个如果是不是就像是代表一个分支呢?
1、一些基本的结构
1.1、if的语法结构
if(表达式)
语句
if 后面括号中的表达式是要判断的语句,如果判断为真,那么就执行括号后面的语句,如果判断为假,那么就不执行后面的语句。(关于判断真假,可以参考另一篇文章)
逻辑关系如图
1.1.1、单条语句:
如果一个if后面想要执行一个语句,那么不需要加花括号。if判定为真后,就会执行它后面的语句。这个语句可以跟if(表达式)在同一行,也可以在下一行。为了使代码看起来更清晰,一般会放在下一行,并且使用缩进,这样可以更好的看到他们的从属关系。下面是一个简单的例子
#include<stdio.h>
int main()
{
int age1 = 20;
int age2 = 17;
if (age1 > 18)
printf("第一个人已经是成年人了诶");
if (age2 > 18)
printf("第二个人已经是成年人了诶");
return 0;
}
这段代码因为20>18,结果为真,所以会打印出第一句话“第一个人已经是成年人了诶”。但第二个二if语句中17<18,结果为假,就不会打印第二句话“第二个人已经是成年人了诶”。
1.1.2、多条语句:
如果一个if后面想要执行多个语句,就需要使用花括号来把多个语句“包装”起来,使他们就像一个整体一样。如下面这个例子:
#include<stdio.h>
int main()
{
int age = 20;
if (age > 18)
{
printf("已经是成年人了诶");
printf("不再是小孩子啦");
}
return 0;
}
这段代码就会把花括号里的两个语句都执行了。
(不过,只执行单个语句也可以用花括号把单个语句括起来,不过没有必要。)
1.2、if—else的用法
if(表达式)
语句1
else
语句2
这句话的意思就是如果表达式为真,那么执行语句1,如果为假,执行语句2。
逻辑关系如图
例子如下
#include<stdio.h>
int main()
{
int age = 20;
if (age > 18)
printf("已经是成年人了诶");
else
printf("还是个未成年人");
return 0;
}
这里如果给age赋值大于18,就会打印出"已经是成年人了诶"如果给age赋值小于等于18,就会打印出"还是个未成年人"。
1.3、多分支 if-else if 的用法
if(表达式1)
语句1
else if(表达式2)
语句2
else if(表达式3)
语句3
.......
从上到下依次判断条件是否为真,若符合 if 条件,就执行if下面的语句;若不符合 if ,就看是否满足下一条 else if 的条件;直到找出符合条件的为止,若所有条件都不符合,就执行 else 的语句。
一个例子:
#include <stdio.h>
int main()
{
int age = 20;
if (age < 18)
printf("少年\n");
else if (age >= 18 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 50)
printf("中年\n");
else if (age >= 50 && age < 80)
printf("老年\n");
else
printf("老老年(咳咳)\n");
return 0;
}
这段代码就会根据给age赋值的不同而输出不同的结果。(&&代表的是并且的意思,即需要&&两两边的表达式都为真,整体的表达式才为真。)
1.4、if语句的嵌套
if(表达式1)
if(表达式2)
语句1;
else
语句2;
即表达式1正确,才可以进入语句,再判断表达式2。相当于要进行两次判断
(ps:可能会有人疑惑这个地方的if-else语句明明有很多行,但是为什么不用加花括号,其实是因为if-else语句包括多分支的if-else if语句都相当于一个语句)
例子
#include<stdio.h>
int main()
{
int a = 2;
int b = 3;
if (a == 2)
if (b == 3)
printf("nihenbang");
else
printf("woyehenbang");
return 0;
}
这段代码首先,a==2为真,再判断b==3也为真,最后会打印出"nihenbang"。
if语句可以嵌套很多层,在很多场景下都会用到。
2.一些注意事项
2.1、多分支中可以没有else语句
以1.3中的例子为例,如果不满足age<80,则最后会打印“老老年(咳咳)”。此时如果把最后的else和else后面的语句删掉,代码也是可以运行的,不过当age>=80的时候没有任何输出。
2.2、悬空else
悬空else的意思是else总会跟与他最近的 并且没有跟别的else匹配过的 if相匹配(听起来很绕口啊),举个简单的例子:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a == 2)
if (b == 2)
printf("nihenbang");
else
printf("woyehenbang");
return 0;
}
这个代码最后运行出的结果是,没有任何输出。
因为else与第二个if相匹配 ,而因为第一个if就判断为假,所以根本就不会进入到第二个if-else语句中。如果还是不明白,可以加上缩进,可能会更清楚一点
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a == 2)
if (b == 2)
printf("nihenbang");
else
printf("woyehenbang");
return 0;
}
这样看是不是恍然大悟了?
所以说必要的缩进相当重要,可以增加代码的可读性。
2.3、判断表达式为等式时
刚开始学c语言时,我经常会在判断表达式为等式的时候,把==写成=,两个等号写作一个等号。两个等号表达的意思是判断是否相等,一个等号代表赋值。可以看看下面这段代码
#include<stdio.h>
int main()
{
int a = 1;
if (a = 2)
printf("nihenbang");
return 0;
}
你认为他会打印出什么东西来吗?如果说不会,那么你答错啦。由于判断表达式为a=2,是非零的,所以判断表达式为真(非零即是真),最后会打印出来。
这一点初学者还是挺容易犯错的。(不过现在如果你输入了“=”,有些编译器会提醒你是否要输入“==”)