C语言有三大结构,选择结构是其中的一种,实现选择结构通常需要使用到if语句和else语句,这篇文章将对if语句和else语句的使用进行介绍。并介绍一些编程习惯和if语句的一些细节问题。
1.if语句的初阶使用
最简单的if语句就是使用if(表达式),表达式的值为0时不执行if后面的语句;如果为非0值则执行语句。
参考代码:
#include <stdio.h>
int main()
{
int a = 3;
if (a)
{
printf("优快云\n");
}
return 0;
}
在VS2019的运行结果:
参考代码:
#include <stdio.h>
int main()
{
int a = 0;
if (a)
{
printf("优快云\n");
}
return 0;
}
在VS2019的运行结果:
那如果学会了,那我们来一个练习:
实现使用键盘输入一个数字,判断它是否为偶数。
参考代码:
//练习:输入一个数字,判断它是否为偶数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if (num % 2 == 0)
{
printf("%d是偶数\n",num);
}
return 0;
}
在VS2019的运行结果:
1.2if与else语句的结合
从1.1中的练习我们提及到,使用scanf函数输入一个数字后,判断它是否为偶数。但是我们知道如果不是偶数,程序也没有显示xx不为偶数,也就是偶数。那我们怎么实现这个呢?这里就要用到else语句。即if语句和else语句相结合。
例子:输入一个数字,区分它是偶数还是奇数。
参考代码:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if (num % 2 == 0)
{
printf("%d是偶数\n",num);
}
else
{
printf("%d是奇数\n",num);
}
return 0;
}
在VS2019的运行结果:
在使用if与else结合的语句中,我们可能会有时候遇到以下这种情况:
#include <stdio.h>
int main()
{
int a = 10;
if (a > 5)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这一段代码的作用是一个数如果大于5就打印hehe,如果小于5就打印haha。很明显,上述代码的运行结果应该是hehe.
在VS2019的运行结果:
这个代码这么简单,那为什么要讲这个代码呢?原因是初学者会出现一些小问题:
比如这样:
此处错误代码:
#include <stdio.h>
int main()
{
int a = 10;
if (a > 5);
printf("hehe\n");
else
printf("haha\n");
return 0;
}
在VS2019的运行结果:
原因是:我们在if(a>5)后面加上了一个分号后。初学者很容易在此处后面加上一个分号。此时如果加上分号,相当于这样:
相当于if后面有了一个空语句,然而它的后面还有一个printf函数,else无法与之匹配对应,所以出现了错误。加上分号后,if语句控制的就是这一个空语句。
那如果看明白了,那我们来一个练习:
练习:输入一个年龄,如果大于等于18岁,在屏幕输出成年;如果小于18岁,在屏幕上输出未成年。
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
}
else
{
printf("未成年\n");
}
return 0;
}
在VS2019的运行结果:
1.3如何输出分支中的多条语句
在C语言中,if语句和else语句都是默认控制1条语句。那如果我们要控制多条语句呢?什么意思?
我们来看看生活中的一些例子和情况:
我们知道成年是18岁,成年后可以报考驾驶证;小于18岁,那就是未成年也就是不可以报考驾驶证。(至少现在大部分地区是这样)对于这个例子,如果大于等于18岁,在屏幕的第一行打印成年,第二行打印未成年,之前的博客中提到了\n换行符可以在printf函数第一个参数格式化字符串中可以使用:这个方法可以参考我之前写的博客:C语言(5)--------->printf函数 优快云
那这个怎么实现呢?
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n可以考驾照\n");
}
else
{
printf("未成年\n不可以考驾照\n");
}
return 0;
}
在VS2019的运行结果:
那如果我不想使用两个换行符呢?因为两个换行符可能让一些人看上去不太美观?而是使用两个printf函数呢?那是直接第一个printf函数的下面再使用一个printf函数吗?
为了简单化,我们先只输出成年的部分:也就是使用两个printf函数,分别在屏幕上的第一行打印:成年,屏幕上的第二行打印:可以考驾照。如何做呢?
下面这一段代码可以吗?
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
printf("可以考驾照\n");
return 0;
}
在VS2019的运行结果:
这个的运行结果好像不对诶,难道是编译器的结果是错的?有怀疑精神很好,但是这里的编译器没有出错。而是我们想错了。实际上,在不加上{}之前,if语句和else语句只能控制一条语句,想要控制多条语句需要使用{}。
当我们在if语句后两个printf函数的时候, 在VS2019中的代码是这样的:
其实VS2019这个IDE已经给我们处理好了编程的格式。在这里我想给大家一个建议,在学习C语言的时候,我们的IDE选择是非常重要的,如果此代码放在DevC++中不一定会有这个提示,在某些情况下我们的代码运行结果和我们想的是一样的时候,实际的代码逻辑并非我们想的那样。一个好的IDE会让我们降低部分学习障碍。
那正确的写法相信聪明的你应该知道了:就是把这两条语句放进一个{}中
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以考驾照\n");
}
return 0;
}
在VS2019的运行结果:
那我们现在回到本节最开始的问题:
成年是18岁,成年后可以报考驾驶证;小于18岁,那就是未成年也就是不可以报考驾驶证。
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以考驾照\n");
}
else
{
printf("未成年\n");
printf("不可以考驾照哦\n");
}
return 0;
}
在VS2019的运行结果:
1.4if语句的嵌入
在读七年级的时候,我们学习了正数和负数的区分,我们知道0既不是正数也不是负数。那如果在C语言中我们输入一个数后,它大于0,我们返回正数;小于0返回负数;等于0返回0。怎么实现呢?
前面提到的if-else语句只能解决两个,是与不是。这个问题明显有三个分支,那怎么去做呢?这里就要用到if-else if-else这种语句:
参考代码:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
{
printf("%d\n",num);
}
else if(num>0)
{
printf("正数\n");
}
else
{
printf("负数\n");
}
return 0;
}
在VS2019的运行结果:
在我们国家,成年是18岁,男性的法定结婚年龄是22岁。那现在我们要求输入一个年龄:
若大于等于18岁小于22岁,打印:成年但是不能结婚
若大于等于22岁,打印:成年可以结婚
若小于18岁,打印:未成年不可以结婚
我们可以这样写:
参考代码:
#include <stdio.h>
int main()
{
int Male_age = 0;
scanf("%d", &Male_age);
if (Male_age >= 18)
{
if (Male_age >= 22)
printf("成年可以结婚\n");
else
printf("成年但是不能结婚\n");
}
else
{
printf("未成年不可以结婚\n");
}
return 0;
}
在VS2019的运行结果:
上面这种if语句的大括号里面又嵌入了if-else语句就是if语句的嵌入 。
我们还可以写成:
使用if-else if-else的语句结果
参考代码:
#include <stdio.h>
int main()
{
int Male_age = 0;
scanf("%d", &Male_age);
if (Male_age >= 18&& Male_age < 22)
{
printf("成年但是不能结婚\n");
}
else if (Male_age >= 22)
{
printf("成年可以结婚\n");
}
else
{
printf("未成年不可以结婚\n");
}
return 0;
}
在VS2019的运行结果:
有了if嵌套语句后,我们可以实现更加复杂的结构。
练习:
输入一个人的年龄,如果:
小于18岁,屏幕打印的内容是:少年
年龄大于等于18岁并且小于等于44岁,屏幕打印的内容是:青年
年龄大于等于45岁并且小于等于59岁,屏幕打印的内容是:中老年
年龄大于等于60岁并且小于等于89岁,屏幕打印的内容是:老年
年龄大于等于90岁,屏幕打印的内容是:老寿星
参考代码:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age >= 18 && age <= 44)
printf("青年\n");
else if (age >= 45 && age <= 59)
printf("中老年\n");
else if (age >= 60 && age <= 89)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
在VS2019的运行结果:
除了用多个的else if语句之外,我们还可以使用if语句的嵌套。
参考代码:
#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;
}
在VS2019的运行结果:
在这里我们就要提到一种编程习惯了,编程其实也是一种艺术,给人观看时应该是赏心悦目的感觉。在这里我们为了代码更加方便阅读,可以加上{},加上{}后更能方便人们的阅读。 那修改后的代码应该是这样的。
参考代码:
#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;
}
在VS2019的运行结果:
1.5悬空else的问题
悬空else的问题是学习C语言的过程中一个非常经典的问题,它是什么意思呢?
若多个if和else共同使用时,else总是与最近的if相匹配。
参考代码:
请问下面的代码的输出结果是什么呢?会是no吗?
#include <stdio.h>
int main()
{
int a = 2;
int b = 3;
if (a == 1)
if (b == 3)
printf("yes\n");
else
printf("no\n");
return 0;
}
在VS2019的运行结果:
为什么运行结果是什么都没有呢?
原因是:在输入上述代码之后,其实是这样的:
VS2019这个开发工具很聪明,else自动和它最近的if进行匹配了。那第一个if其实是控制了第二个if一直到第一个printf函数分号的位置(原因C语言是一个分号为一句话,而if在不加括号的情况下只能控制一条语句也就是一句话)。
那为了方便理解,我们应该如何修改代码呢?
参考代码:
#include <stdio.h>
int main()
{
int a = 2;
int b = 3;
if (a == 1)
{
if (b == 3)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
在VS2019的运行结果:
如果我们要else与第一个if进行匹配,应该怎么做呢?加上大括号{}即可。
参考代码:
#include <stdio.h>
int main()
{
int a = 2;
int b = 3;
if (a == 1)
{
if (b == 3)
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
在VS2019的运行结果:
在一些初学者刚开始学习编程时会出现下面的情况:
对于大多数人来说,上面的的代码给人的感觉时是非常不好的。我们应当避免这种编程代码的书写。
这个地方给了我们什么提示呢?
1.在编程时,我们适当使用大括号会使得我们的代码的逻辑更加清晰。
2.代码的可读性是非常重要的。
3.选择一个好的开发工具是很重要的。