C语言是一门结构化的程序设计语言
支持三种结构:
- 顺序结构:正常的从头写到尾
- 选择结构:if语句;switch语句
- 循环结构:while循环;for循环;do-while循环
if
if语句的语法形式:
if(表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0为真,不论是负数,正数还是任何数,只要是非0就为真,是0就为假
例子:输入一个整数,判断是否为奇数
int main()
{
int num=0;//创建一个整形变量num给它初始化
//输入
scanf("%d,&num");//输入一个数放到num里面去
//判断(如果为奇数,就打印奇数,如果不是奇数,就不打印)
if(num%2==1)//奇数除以2余1,所以取模,模为1就为奇数
printf("奇数\n");
return 0;
}
当键盘输入为10时,发现不打印任何东西,因为10%2==0,不等于1,此时这个表达式为假,所以语句不会执行
重新运行,键盘输入11时,则会打印出奇数。因为11%2等于1
if表达式中判断为0,语句执行的情况
当把if表达式中改动一下
发现表达式最后等于0也执行下面的代码。
这是因为这是判断等于0,编译器认为这个是正确的,判断结束后返回的是1
所以只有单独写的时候,0为假,非0为真
if…else…
继上面的例子,如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这就需要用到if…else…语句了,语法形式如下:
if(表达式)
语句1
else
语句2
例子:
此时10%2不等于1,则会执行else语句,打印偶数。
所以,利用if…else…不论是奇数还是偶数,程序都能应付的过来
练习
输入一个年龄,>=18岁就输出:成年,否则就输出:未成年
输入20,可打印出成年
输入12,可打印未成年
分支中包含多条语句
在 if 或 else 中包含多条语句
在上例中,当年龄大于等于18时,不仅仅打印“成年”,再使它打印一条“可以谈恋爱了”这条语句,使 if 中包含多条语句,此时这两句语句都由if语句来控制
此时报错,因为:默认情况下 if 或 else 后面只能跟一条语句,如果想它们包含多条语句,则需要给它们一对大括号。
此时则运行成功
而在 else 后面再填一句“不能谈恋爱”
会发现 else 语句下的不能谈恋爱也被打印了
因为因为这条语句压根没受 else 约束,根本就不是 else 里面的,格式像这样:
当板块1 if 执行完后,板块2 else 不被执行,接着板块3按顺序就被执行了
所以,即使是在else里面,也得加上大括号,此时程序就没有问题了
所以:
如果 if 或 else 后面只跟一条语句,则不需要大括号;如果后面跟多条语句,则需要加大括号(代码块/程序块/复合语句)
嵌套if
在 if…else…语句中,else可以与另一个 if 语句连用,构成多重判断
比如:要求输入一个整数,判断输入的整数是0,还是整数或负数
也就是要判断三种情况:0,整数,负数
前面的 if…else…只有两种情况,所以此题可以写成嵌套。
以上格式可以简化写成:
可以理解为把选中的那段代码嵌套在最前面那个 else 里,在选中的代码中又分为大于0小于0
练习1
输入一个整数,如果是正数(大于0),再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。
int main()
{
int num = 0;
//输入
scanf("%d",&num);
if (num > 0)//判断大于0后还得判断是奇是偶,所以用大括号,大括号里有两种情况
{
//判断奇数还是偶数
if (num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("非正数\n");
}
return 0;
}
练习2
输入一个人的年龄
如果年龄<18岁,打印“少年”
如果年龄在18岁至44岁打印“青年”
如果年龄在45岁至59岁打印“中老年”
如果年龄在60岁至89岁打印“老年”
如果90岁以上打印“老寿星”
int main()
{
int age = 0;
//输入
scanf("%d",&age);
if (age < 18)//小于,等于18已判断
printf("少年\n");
else//大于,等于18的情况全在这个逻辑中
{
if (age <= 44)//小于,等于44判断了,else全为大于44
printf("青年\n");
else//大于44全在这个逻辑中
{
if (age <= 59)//小于,等于59判断了,else全为大于59
printf("中老年\n");
else//大于59全在这个逻辑中
{
if (age <=89)//小于,等于89判断了,剩下90以上全在else里
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
简写版:
int main()
{
int age = 0;
//输入
scanf("%d",&age);
if (age < 18)//小于,等于18已判断
printf("少年\n");
else if (age <= 44)//大于18,小于等于44的判断了,else全为大于44
printf("青年\n");
else if (age <= 59)//大于44,小于等于59判断了,else全为大于59
printf("中老年\n");
else if (age <=89)//大于59,小于等于89判断了,剩下90以上全在else里
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
悬空else问题
如果有多个 if 和 else,可以记住这样一条规则,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;
}
这段代码最后什么也没有输出
错误想法:
a为0,b为2,a不为1,所以执行else打印“haha”
因为 else 总是和它最接近的 if 匹配,所以else与第二个 if 匹配。
框起来的if…else…才是一对,但是它们要运行的话,就必须得进到94行代码里,但是a=0,并不为1,所以没进到94行代码里,方框里的代码不执行,程序到最后什么也没有输出
正确格式应该是:
#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;
}
所以平时的代码格式也很重要,推荐书:《高质量的C-C++编程》
那么如何让第一个 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;
}
直接在 if 后面加一个大括号,将它们隔开
这样程序运行 haha 就被打印出来了