选择结构又叫分支结构,在C语言中我们常常会用到if语句和switch语句来帮助我们实现选择结构。
1.1 if
if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
if语句的一般形式如下:
if(表达式)
语句1
if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式。其中最直观、最容易理解的是关系表达式。所谓关系表达式就是两个数值进行比较的式子。
表达式成立(为真),语句执行;表达式不成立(为假),语句不执行。
在C语言中,0表示假,非0表示真,这就意味着如果表达式结果为0,则表达式为假,即语句不执行,反之,则语句执行。
例如,输入一个整数,判断其是否为偶数。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if(a % 2 == 0)
{
printf("%d为偶数\n", a);
}
return 0;
}
运行结果为:
但是我们也发现了,我们输入一个便于判断的偶数,输出的就是“这个数为偶数”,那如果我们输入一个奇数呢?运行结果是这样的:
我们会发现什么都没有输出,这是因为我们没有设置“这个数是奇数”的表达式和语句,那么如何才能在一个程序中非常简便的判断一个数到底是奇数还是偶数呢,那么就要用到我们的else语句了。
1.2 else
else语句一般是配合if语句一起使用的,他们的一般语法形式如下:
if(表达式)
语句1
else
语句2
else语句的执行条件是与if语句中的表达式互补的一种条件。
例如1.1的奇数偶数问题,一个整数,除了偶数的情况,就是奇数的情况(我学习的版本0是偶数)。所以我们可以写出以下代码:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if(a % 2 == 0)
{
printf("%d为偶数\n", a);
}
else
{
printf("%d为奇数\n", a);
}
return 0;
}
我们运行程序,输入一个奇数,会发现现在程序打印了“这个数为奇数”这一串语句。
1.3 分支中包含多条语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
我们可以看到,这串代码中if语句后面有两个printf语句,那如果我们输入一个符合if表达式的数字和不符合表达式的数字,运行结果会显示什么呢。
我们可以看到,不论我们输入的数字符不符合if的表达式,我们的运行结果上面都会打印第二个printf语句。如果我们把第二个printf语句与if语句对齐后在执行程序呢,结果表明,和上方的结果一模一样(有兴趣的可以自己试一试)。
这是因为在C语言中,if语句只能控制一条语句,第一个printf语句在if语句的控制下,如果表达式成立,则语句执行,不成立,则语句不执行,而第二个printf语句与if语句毫无关系,即if语句不控制第二个printf语句,所以当if语句的表达式成不成立,第二个printf语句都会执行。那么有什么办法让一个if语句控制多条语句吗?我们可以用{}把我们想让if语句控制的语句给括起来,这样就实现了一个if语句控制多条语句。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)//if 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
return 0;
}
同样的,else语句后面想要控制多条语句也是如此。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)//if 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else//else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("没有成年\n");
printf("不可以谈恋爱\n");
}
return 0;
}
1.4 if的嵌套
在if else语句中,else可以与另⼀个if语句连⽤,构成多重判断。
#include <std8io.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num > 0) //这⾥的if相当于嵌套在else语句中,形成了嵌套结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
第一个else后面的if和else就是镶嵌在else后面的语句,构成了if语句的嵌套。
例如,输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num > 0)
{
if (num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("负数\n");
}
return 0;
}
有了嵌套if语句,我们就可以完成更多复杂逻辑的判断。
1.5 悬空else的问题
首先我们来看一组代码。
#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;
}
你认为这组代码的运行结果是什么,是“hehe”、还是“haha”、还是什么都没有。让我们运行代码来看一下。
你会惊奇的发现运行结果什么都没有,那么这是怎么回事呢。
这其实是悬空else的问题,如果有多个if和else,可以记住这样⼀条规则,else总是跟与它最接近
的if匹配。
上⾯的代码排版,让else和第⼀个if语句对⻬,让我们误以为else是和第⼀个if匹配的,当if语句不成⽴的时候,自然想到的就是执⾏else⼦句,打印haha,但实际上else是和第⼆个if进⾏匹配的,这样后边的if else语句是嵌套在第⼀个if语句中的,如果第⼀个if语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。
这个代码也可以写成这个样子。
#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;
}
这样就好理解了。
如果我们想让else与第一个if相匹配的话,就要用到我们的大括号了。
#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;
}
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以建议大家再写if等语句时加上大括号。