C语言中的分支和循环(上)
一、前言
一、前言
我们知道,C语言是一门结构化的程序设计语言,他支持三种结构:
顺序结构
选择结构:if 、switch
循环结构: for、 while、 do while
其实,不止是C语言,我们生活中遇到的事情也往往是由着三种结构所组成的。今天,让我们来了解C语言中的选择结构。
二、if语句
2.1、什么是选择结构
首先什么是选择结构,下面我们来看一张图:
其实C语言中的选择结构与现实中的选择也是类似的,下面是C语言中if语句的执行流程:
2.2、if语句语法形式
if语句的语法形式如下:
1 if ( 表达式 )
2 语句
if语句的表达形式非常简单
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真(负数也表示真)
即表达式的结果是0,语句不执行,表达式的结果不是0,表达式执行
例子:输入一个0到100的分数,判断是否及格
# include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 60)
printf("恭喜你,及格了!");
return 0;
}
2.3、if…else…语句
如果所给的分数他没有及格,那他就是不及格了(怎么感觉在讲废话),那我们怎么清楚地知道他有没有及格呢?
这就需要我们的 if…else… 语句了
在C语言中,else 是一个可选的关键字,用于在 if 语句中添加条件不满足时执行的代码块。当 if 语句中的条件为假时,程序会跳过if代码块中的内容,然后执行 else 代码块中的内容。
语法形式如下:
1 if ( 表达式 )
2 语句1;
3 else
4 语句2;
接着上面的例子:
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 60)
printf("恭喜你,及格了!/n");
else
printf("好好好,没及格是吧,等着重修吧");
return 0;
}
2.4、分支中包含多条语句
下面我们先来看一个例子:
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 60)
printf("恭喜你!/n");
printf("及格了!/n");
return 0;
}
让我们看看代码的运行结果:
我们发现,无论打印的数字是否>=60,屏幕都会打印 “及格了!”,这是为什么呢?
原来,在C语言中默认 if 和 else 语句都只控制一条语句,就算上下两个“printf”对齐了也无济于事。
如果想让 if 控制多条语句,那我们需要用 “{}” 将他们括起来,同理 else 也是如此。
下面是这段代码的正确写法:
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 60)
{
printf("恭喜你!\n");
printf("及格了!");
}
else
{
printf("好好好,没及格是吧\n");
printf("等着重修吧!\n");
}
return 0;
}
2.5、嵌套if
在C语言中多个 “if…else…” 可以连用,构成多重选择。
例如:要求输入一个分数,判断不及格、及格、优秀。
# include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 60)
{
printf("好好好,没及格是吧!\n");
printf("等着重修吧!\n");
}
else
{
if (a < 85)
{
printf("恭喜你!\n");
printf("及格了!\n");
}
else
printf("哥,别卷了\n");
}
return 0;
}
该代码有一个更简便的写法,将非必要的 “{}” 去掉,即 “else if” 语句。
# include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 60)
{
printf("好好好,没及格是吧!\n");
printf("等着重修吧!\n");
}
else if(a < 85)
{
printf("恭喜你!\n");
printf("及格了!\n");
}
else
printf("哥,别卷了\n");
return 0;
}
接着,我们来看一段错误的代码:
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 60)
{
printf("不及格!\n");
}
if (a < 85)
{
printf("及格了!\n");
}
else
{
printf("优秀!\n");
}
return 0;
}
当输入59时,运行结果如下:
好家伙,到底是及格还是不及格呢,这是怎么回事呢
这是因为这个代码的第二个判断语句用的是 if 而不是 else if
if 是会独立执行的,条件满足及格 if 语句就执行几个 if 语句
而else if 语句,当前面的 if 语句被执行后,将不再执行
2.6、悬空else问题
如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最近的 if 相匹配。
下面我们看一段代码:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("good\n");
else
printf("oh no\n");
return 0;
}
代码的运行结果是啥?
很多同学以为:a是0,那就执行 else 子语句,即打印“oh no”
但输出结果是:啥都不输出
为什么呢
因为 else 总是跟着最近的 if 匹配,即使 else 对齐的是第一个 if 也无济于事
但我们反过来想,如果 else 对齐的是第二个 if,是不是一目了然呢,可见好的代码风格无比重要。
如果想让代码正确实现,在一个 if 后面加上大括号,将子语句括起来就行啦,这样即使 else 有天大的本事,那也只能对应第一个 if。
小贴士:
上述" if (b == 2)" 可以写成" if (2 == b)"
因为初学着很容易将“赋值 =”与“等于 ==”记错,他们在语法上没有任何错误,这样写的话当想要实现“等于”而不小心写成“赋值”的话系统就会报错来提示你
三、switch语句
当我们的选择情况非常多时,用else if语句就会显得非常繁琐,这时我们就可以使用switch语句。它用于判断条件有多个结果的情况,把多重的 else if 改成更易用,可读性更好的形式。
3.1、switch语句语法形式
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式expression的不同值,执行相应的 case 分支,如果找不到对应的值。就执行 default 分支
注:
1、 switch 后面的 expression 必须是整型表达式
2、 case 后面的值,必须是整型常量表达式
3、 case 必须加 “空格” 后才能接后面的值
4、 case 和 default 后面接的是 “:” 而不是 “;”
5、 switch 语句中的 “default” 并没有顺序要求,只要你的顺序是满足实际需求就可以
3.2、switch语句中的break
首先我们先看一段代码:
int main()
{
char a = 0;
scanf("%c", &a);
switch (a)
{
case 'A':
printf("优秀\n");
case 'B':
printf("良好\n");
case 'C':
printf("合格\n");
default:
printf("不合格\n");
}
return 0;
}
如果我们输入“A”,结果是什么呢?
怪事怪事,怎么全都打印出来呢,不应值打印优秀吗
其实,switch 语句中, case 只负责从哪里进入,而从哪里出,则由 break 掌管
如果某一个 case 语句的后面没有 break 语句,代码会继续往下执行,有可能执行其他的 case 语句中的代码,知道遇到 break 或者 switch 语句结束。
正确代码:
int main()
{
char a = 0;
scanf("%c", &a);
switch (a)
{
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("合格\n");
break;
default:
printf("不合格\n");
break;
}
return 0;
}
好啦,本期分支语句就介绍到这里啦,希望本期博客能对你有所帮助,同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!