这里写目录标题
C语言支持三种结构
1.顺序结构
2.选择结构
3.循环结构C语言主要用if、switch语句实现分支结构
1.if语句
1.1 if
格式:
if(条件表达式){
语句
}
如果条件表达式成立(真),执行语句;如果不成立(假),则不执行语句
本质:在C语言中0为假,非0为真,即条件表达式为非0,则执行语句;若为0则不执行语句
例:判断一个数是否为正数,是正数的话打印"其是正数"
int main() {
int num = 0;
scanf("%d", &num);
if (num>0)
{
printf("%d是正数",num);
}
return 0;
}
注意:这里if语句在没有{}的情况下只能默认控制往下第一条语句,所以建议使用大括号{}将其包括起来
int main() {
int num = 0;
scanf("%d", &num);
if (num>0)
printf("%d是正数\n",num);
printf("%d是个数", num);//没有{}包括 所以不受if语句影响
return 0;
}
因为if只控制下面一条语句,所以无论num是否大于0第二行的内容都会打印
同样else同理,没有大括号{}包括也只影响往下一条语句
1.2 else
格式:
if(条件表达式){
语句1
}else{
语句2
}
如果条件表达式成立(真),则执行语句1
如果条件表达式不成立(假),则执行语句2
例:判断一个数是否为正数,是正数的话打印"其是正数",否则打印”其非正数“
int main() {
int num = 0;
scanf("%d", &num);
if (num>0)
{
printf("%d是正数",num);
}
else
{
printf("%d是非正数", num);
}
return 0;
}
1.3 嵌套if(else if)
格式:
if(条件表达式1){
语句1
}else if(条件表达式2){
语句2
}else{
语句3
}
如果条件表达式1成立(真),则执行语句1;
如果条件表达式1不成立(假),则对条件表达式2进行判断,若条件表达式2成立(真),则执行语句2;否则执行语句3
其实就相当于在else语句里面又重新添加了一对if…else…语句
输⼊⼀个⼈的年龄 如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中老年"
如果年龄在60岁⾄89岁打印"老年"
如果90岁及以上打印"老寿星"
int main() {
int age = 0;
scanf("%d", &age);
if (age < 18 && age >= 0) {
printf("少年");
}
else if (age <= 44)
{
printf("青年");
}
else if (age <= 59)
{
printf("中老年");
}
else if (age <= 89)
{
printf("老年");
}
else if(age >= 90)
{
printf("老寿星");
}
else
{
printf("报错!");
}
return 0;
}
1.4 悬空else问题
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("11111\n");
else
printf("22222\n");
return 0;
这段代码输出的内容是哪个?我猜大部分人会选择22222
事实上,这段代码啥也没有输出
记住一条规则,没有{}的情况下,else跟最近的if进行匹配
我们把{}加上为其分块,这样就很明了了
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
若希望第一行的else和else能够匹配,适当的加上{},就会使代码的逻辑结构变得更加清晰,代码的可读性也会变得更高
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
2.关系运算符
C语言中用于比较的表达式,称为 关系表达式
关系表达式中使用到的运算符,称为 关系运算符
0为假
非0为真
注意事项:
注意点1:关系运算符== 和 赋值= 是完全不同的两种符号且意义也完全不同
a==1 是拿变量a与1作比较,若成立则为非0;否则为0
a = 1 是将1这个值赋值给变量a
注意点2:多个关系运算符不宜直接连用
比如 a < b < c,虽然这是合法的表达式,但是其有时并非表达为我们想要的意思
原因:C语言中关系表达式是从左至右计算的
a < b < c 我们的角度 想表达 b大于a且小于c
(a<b) < c 编译器的角度 先得出关系表达式a<b的结果x,再得出x<c关系表达式的结果
关系表达式(a<b)的结果只有0或非0,(然后0或非0)小于c做比较,所以表达的意思完全不同
例:年龄大于等于18岁,小于等于36岁,则输出青年
int age = 0;
scanf("%d", &age);
if(18<=age<=36)
{
printf("⻘年\n");
}
return 0;
上述代码,此时输入12,编译器先比较18<=12,不成立,返回0;再0<=36,成立,返回非0,执行if内的语句
但是与我们实际需要表达的意思是不一致的。
int age = 0;
scanf("%d", &age);
if(18<=age && age<=36)
{
printf("⻘年\n");
}
return 0;
此时应该添加逻辑运算符中的与运算符(&&),就能使其正确的表达我们的意思
3.逻辑运算符
逻辑运算符提供逻辑判断功能,主要有以下三个运算符
3.1 逻辑取反运算符(!)
int a = 0;//条件表达式中0为假
if (!a)
{
printf("true");
}
else
{
printf("false");
}
return 0;
结果:true
3.2 逻辑与运算符(&&)
int a = 0;
int b = 1;
if (a && b)// 0 && 1 结果为 0
{
printf("true");
}
else
{
printf("false");
}
return 0;
结果:false
3.3 逻辑或运算符(||)
int a = 0;
int b = 1;
if (a || b)// 0 || 1 结果为 0
{
printf("true");
}
else
{
printf("false");
}
return 0;
结果:true
3.4 练习:闰年的判断
输入一个年份year,判断其是否为闰年
闰年:
1.能被4整除且不能被100整除是闰年
2.能被400整除是闰年
//代码1
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0){
printf("%d是闰年\n",year);
}
else if (year % 400 == 0) {
printf("%d是闰年\n", year);
}
return 0;
}
//代码2
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("%d是闰年\n", year);
return 0;
}
3.5 短路
C语言逻辑运算符的一个特点,上面说到关系运算符的计算顺序是从左至右,逻辑表达运算符也是如此,即==逻辑表达式中,判断逻辑的顺序从左至右==。
若逻辑表达式中 左边的逻辑表达式若是满足逻辑运算符对应的条件,则不会再判断右边的逻辑表达式,俗称’短路"
短路条件
逻辑与运算符
int month = 2;
if(month >= 3 && month <= 5){//左边0 即 不成立
printf("短路,右边不需要执行")
}
与运算符(&&)
若左边表达式结果为0,不成立,右边表达式不需要执行
逻辑或运算符
int month = 2;
if(month >= 1 || month <= 0){//左边非0 即 成立
printf("未短路,右边需要执行")
}
或运算符(||)
若左边表达式结果为非0,成立,右边表达式不需要执行
4.switch语句
4.1 switch
switch语句是一种特殊的if…else…结构,用于判断有多个结果的情况
格式:
switch(条件表达式){//结果必须为整型
case value0:
语句0;
break;
case value1:
语句1;
break;
case value2:
语句1;
break;
default:
语句d;
break;
}
=注:
1.条件表达式一定为整型表达式
2.case value中value必须为整型常量,case后面有个空格
例
输入1-5,打印周一至周五
输入6-7,打印休息日
int main() {
int weekday = 0;
scanf("%d", &weekday);
switch (weekday){
case 1:
{
printf("星期一");
break;
}
case 2:
{
printf("星期二");
break;
}
case 3:
{
printf("星期三");
break;
}
case 4:
{
printf("星期四");
break;
}
case 5:
{
printf("星期五");
break;
}
default:
{
printf("休息日");
break;
}
}
return 0;
}
4.2 break
break意义为终止的意思,每一个case语句执行完之后,需要加上break才能跳出switch语句
否则,将会继续执行下面的case语句,直至遇到break或者switch语句执行完毕为止
int main() {
int weekday = 0;
scanf("%d", &weekday);
switch (weekday){
case 1:
printf("星期一");
case 2:
printf("星期二");
case 3:
printf("星期三");
case 4:
printf("星期四");
case 5:
printf("星期五");
break;
}
default:
{
printf("休息日");
break;
}
}
return 0;
}
上述代码1-4都没有break,直至5才有break
所以输入1后,会一将下面的case 2-4的语句全部执行,直至遇到case 5语句中的break才结束程序。
例:
输入1-5,输出工作日
输入6-7,输出休息日
int weekday = 0;
scanf("%d", &weekday);
switch (weekday){
case 1:
case 2:
case 3:
case 4:
case 5:
{
printf("星期五");
break;
}
case 6:
case 7:
{
printf("休息日");
break;
}
}
可以将case像这样合并起来堆叠使用
4.3 default
int main() {
int weekday = 0;
scanf("%d", &weekday);
switch (weekday){
case 1:
{
printf("星期一");
break;
}
case 2:
{
printf("星期二");
break;
}
case 3:
{
printf("星期三");
break;
}
case 4:
{
printf("星期四");
break;
}
case 5:
{
printf("星期五");
break;
}
default:
{
printf("休息日");
break;
}
}
return 0;
}
switch后面的条件表达式得出的值无法匹配所有的case语句,则执行default子句
deafult即默认的意思
即:输入除1-5数字以外的数字,结果均为休息日