这篇博客我将介绍C语言中的分支和循环。C语言是一种结构化的程序设计语言,而这里的结构指的就是顺序结构,选择结构和循环结构。我们可以使用 if,switch 实现分支结构,使用for while 和 do while实现循环结构。
if语句
if语句的表达式如下
if(表达式)
{
语句
}
表达式为真则语句执行,表达式为假则语句不执行。在C语言中0为假,非0为真,所以若表达式结果为0则语句不执行,表达式结果不为0则语句执行。
示例:输入一个整数判断是否为奇数
#include <stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)
{
printf("%d是奇数",num);
}
return 0;
}
与if相对应的则是else语句,如果一个数不是奇数那么就是偶数。此时我们可以用if...else...来判断这个整数是奇数还是偶数。
if(表达式)
{
语句1
}
else
{
语句2
}
用这种语句我就可以实现一些基本功能
示例:C语言输入一个年龄,>=18就输出成年,反之输出未成年
#include<stdio.h>
int main()
{
int age;
printf("请输入年龄:");
scanf("%d", &age);
if(age >= 18)
{
printf("成年\n");
}else
{
printf("未成年\n");
}
return 0;
}
需要我们注意的是if和else语句中默认都只控制一条语句,若需要控制多条语句则需要 {} 将代码括起来,上述代码已经向大家展示出来啦。既然是分支结构那我们能不能尝试嵌套if呢?结果是肯定的,闲话不用多说,直接上代码展示。
#include <stdio.h>
int main()
{
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num == 0)
{
printf("输入的整数是0\n");
} else if (num > 0)
{
printf("输入的整数是正数\n");
}
else
{
printf("输入的整数是负数\n");
}
return 0;
}
上述代码向我们证明了 else 可以与 if 连用,构成多重判断。有了嵌套if语句我们就可以完成更多复杂的逻辑判断啦
我们还需要注意悬空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,不等于 1 ,那就执行 else 句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。为什么呢? 这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近 的 if 匹配。 上面的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 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;
}
或者如果我们希望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;
}
这就是为什么我们要带大括号的原因,只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。
关系操作符
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称 为“关系运算符”(relational operator),主要有下面6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符 (要注意==与=的区别)
!= 不相等运算符
关系表达式通常返回 0 或 1 ,表示真假。 C 语言中, 0 表示假,所有非零值表⽰真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。 关系表达式常用于 if 或 while 结构。
条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
逻辑操作符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。
在这里有一点需要我们注意:短路
C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。简单的来说:
&&操作符左边操作数的结果是0的时候,右边操作数就不再执行。
|| 操作符的左操作数的结果不为0时,就⽆需执行右操作数。
switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。 switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重 的 else if 改成更易⽤、可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值, 就执行 default 分⽀。 需要注意的是: switch 后的 expression 必须是整型表达式 。 case 后的值,必须是整形常量表达式。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
switch语句中的break
只有在 switch 语句中使用break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。 所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊ default ⼦句。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏ default ⼦句。
switch语句中的case和default的顺序问题
在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗? 其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default 子句放在最后处理的。
这篇博客我们就先介绍到这里,感谢大家的浏览,欢迎大家在评论区提出宝贵意见。