文章目录
前言
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、分支结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所常的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使用 if 、 switch
实现分支结构,使用 for 、 while 、 do while
实现循环结构。
顺序结构是最简单的一种结构,程序按照代码书写的顺序依次执行语句,没有分支和循环。每条语句执行一次且仅执行一次。所以本期内容不会赘述,我们着重给大家介绍分支结构,下一期将介绍循环结构
一、if语句
1.if与else
if语法形式:
if ( 表达式 )
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是不是0,则语句执行。
else语法形式:
if ( 表达式 )
语句1
else
语句2
其实这也很容易理解,英语中if:如果,else:其他的
流程图如下:
2.默认控制一条语句
练习:输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
默认在 if 和 else 语句中默认都只控制一条语句,比如:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
printf("可以考驾照辣!\n");
else
printf("未成年\n");
return 0;
}
输入年龄16岁,打印的信息如下:
可以考驾照辣!
未成年
这是为什么呢?因为默认控制一条语句,所以我们要用括号括起来
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
{
printf("成年\n");
printf("可以考驾照辣!\n");
}
else
printf("未成年\n");
return 0;
}
这样问题就解决了。
另外,if还可以嵌套,就像这样
if (...){
if ()
{
//...
}
else
{
//...
}
}
else(...) {
if ()
{
//...
}
else()
{
//...
}
}
举个例子,
if (age < 18) {
printf("你是儿童或青少年。\n");
if (age < 13) {
printf("并且,你是儿童。\n");
} else {
printf("并且,你是青少年。\n");
}
} else {
printf("你是成年人。\n");
if (age < 60) {
printf("并且,你是青年或中年人。\n");
} else {
printf("并且,你是老年人。\n");
}
}
但是,这样看起来较为繁琐,因此我们可以简洁地写为
if (age < 18) {
printf("你是儿童或青少年。\n");
if (age < 13) {
printf("并且,你是儿童。\n");
}
else {
printf("并且,你是青少年。\n");
}
}
else if (age < 60) {
printf("你是成年人。\n");
printf("并且,你是青年或中年人。\n");
}
else {
printf("并且,你是老年人。\n");
}
像这样地多分支条件语句,可以写成这样
if(条件1){//...}
else if(条件2){//...}
else {//...}
3.悬空else
最后一个知识点就是悬空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 和 else ,可以记住这样一条规则, else 总是跟最接近 的 if 匹配
。
上面的代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第一个if匹配的,当 if
语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if
进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不
成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。
二、常用操作符
关于操作符,在后面的更新中,我会详细的讲解。
本文只介绍几种与分支结构相关的操作符。
1.关系操作符
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。
• >
:大于运算符
• <
:小于运算符
• >=
:大于等于运算符
• <=
:小于等于运算符
• ==
:相等运算符
• !=
:不相等运算符
着重看一下后面两个,别混淆相等运算符==
和赋值运算符=
,!
表示非的意思,!=
就是不等于
关系运算符通常返回1/0,表示真假。
1>3//返回0,表示假
所以常用于if
和while
中
if (x == 3) {
printf("x is 3.\n");
}
2.条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
1 exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
b = a>5 ? 3:-3;
printf("%d\n", b);
return 0;
}
b等于多少呢?
因为a等于0,a>5为假,所以表达式结果是-3,b就等于-3
练习:使用条件表达式实现找两个数中较大值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
3.逻辑运算符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
• !
:逻辑取反运算符(改变单个表达式的真假)。
• &&
:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• ||
:或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假
!
:逻辑取反运算符
如果变量 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
&&
:与运算符
&& 就是与运算符,也是并且的意思, && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
||
:或运算符
两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
注意点:
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。
练习:
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
解析:
这里的++符号是自增符号:
当++放在变量之前时(如++var),这被称为前置自增运算符(先增后用)
1.先将变量的值加1。
2.然后返回加1之后的新值
而当++放在变量之后时(如var++),这被称为后置自增运算符(先用后增)
1.先返回变量当前的值。
2.然后再将变量的值加1。
【后期会详细讲解】
那让我们看这道例题,a++
,后置++,先用后加,因为a原值是0,并且是&&
,那么后面不在计算,a++ && ++b && d++
表达式返回值为0(假),即i = 0
,后面a会自增,a = 0 + 1
输出结果:
a = 1
b = 2
c = 3
d = 4
将代码改为这样呢?
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
||
的话就是左边为真后面就不会执行了
输出结果:
a = 1
b = 3
c = 3
d = 4
三、switch语句
1.介绍
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重
的 else if 改成更易用、可读性更好的形式。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式 expression
不同的值,执行相应的 case
分支。如果找不到对应的值,
就执行 default
分支。
-
switch 后的 expression 必须是整型表达式(任何能够产生整数值的表达式)
-
case 后的值,必须是整形常量表达式(包含整型常量(如10、-20、42U等)、
字符常量
(如’X’)、枚举常量以及用算术运算符(+、-、*、/、%)连接这些常量的表达式) -
case与value之间必须有一个空格
-
default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default 子句放在最后处理的。
2.switch中的break
在此之前,我们先做一个练习
输入一个1~7的数字,打印对应的星期几
输入:1 输出:星期一
输入:2 输出:星期二
输入:3 输出:星期三
输入:4 输出:星期四
输入:5 输出:星期五
输入:6 输出:星期六
输入:7 输出:星期天
代码:
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期⼀\n");
case 2:
printf("星期⼆\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
我们输入数字5,发现结果不尽人意:
星期五
星期六
星期日
为什么会打印三个呢,观察代码我们猜测因为5对应case 5,打印星期五,但是没有暂停,继续打印后面的内容。
其实,原因就是如此。
如何解决这个问题呢,需要break
(暂停,打断),正如意思所说,break可以“打断”程序,遇到break会直接退出switch分支。
现在我们修改代码,可达到预期的结果。如下:
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期⼀\n");
break;
case 2:
printf("星期⼆\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
3.switch中的default
在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句。
比如,在上面的例子中,如果输入不是1~7的数字的话,就输出“输入错误”,怎么做呢?使用default。如下:
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("⼯作⽇\n");
break;
case 6:
case 7:
printf("休息⽇\n");
break;
default:
printf("输⼊错误\n");
break;
}
return 0;
}
四、总结
读到这里,相信你已经对C语言分支结构有一定的收获和理解。如果你觉得这篇博文对你有所帮助,请给我点个赞吧😁,感激不尽!
如果你愿意和我一起学习,请关注我吧ε=ε=ε=( ̄▽ ̄)🎉
完