C语言-分支与循环

目录

1. if语句

1.1. if

if的标准格式如下:

1.if(条件){
2.    语句;
3.}

条件为真(非0)即执行语句,反之(为0)则不执行语句。

值得注意的是,当输入语句为单条时,if后的花括号可省略,但建议还是加上,保持代码的可读性与整齐度。

1.2. else

if...else...的标准格式如下:

​1.if(条件){
2.    语句1;
3.}
4.else{
5.   语句2;
6.}

​

当条件符合时,执行语句1。反之则执行语句2。

要注意,else满足就近原则,即其指向的是距离最近且无其他else配对的if。

1.if(条件1){
2.    语句1;
3.}
4.    if(条件2){
5.        语句2;
6.    }
7.else{
8.   语句3;
9.}

​

​

在上图中,虽然else在位置上与第一个if对齐,但其实跟随的是第二个if。

2. 关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator)。
•  >    ⼤于运算符
<    ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!=   不相等运算符
关系表达式通常返回1或0,用以表达真假。
例如:
1.#define _CRT_SECURE_NO_WARNINGS
2.#include <stdio.h>
3.
4.int main() {
5.	   int a = 0;
6.	   int b = 1;
7.	   if (a == b) {
8.		   printf("√");
9.	   }
10.	   else {
11.		   printf("×");
12.	   }
13.	   return 0;
14.}

在上述代码中,由于a!=b,所以会执行else中的语句,则输出结果为×。

需要注意的是,多个关系操作符并不能连用,而是需要在中间使用逻辑操作符。

3. 条件操作符

在这里我们介绍的条件操作符即为三目操作符,标准格式如下:

1.exp1 ? exp2 : exp3

若exp1执行为真,则采取exp2;若exp1为假,则采取exp3。

4. 逻辑操作符:&& , || , !

!     逻辑取反运算符(改变单个表达式的真假)。
&& 与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
||     或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)

4.1. 短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
1.if(a>1 && a<3)

对于以上代码,若a!>1,则左侧表达式为假(即0),此时整个表达式的结果为0,并不需要判断右侧表达式。

对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
1.if(a>12 || a<6 || a==7)

如果a>12,则不用再判断右侧表达式,整个表达式的结果也为1。

|| 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

5. switch语句

除if...else的方式外,我们还有一种代码,可以用来编写多分支情况,那就是switch...case语句。其标准格式如下:

1.switch (expression) {
2. case value1: statement
3. case value2: statement
4. default: statement
5.}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
需要读者注意的是:
switch 后的 expression 必须是整型表达式。
case   后的值,必须是整形常量表达式。

5.1. switch与break语句

我们可以把case value1视作一个入口,当case语句中没有break时,我们从入口进入,便像坐滑滑梯一样顺着滑下,继续执行case value2,case value3,default等等。而break则像滑梯的出口,当你从case value中进入,执行到break出口时,便跳出,不执行下面的语句。

1.#include <stdio.h>
2.int main()
3.{
4.int n = 0;
5.scanf("%d", &n);
6. switch(n%3)
7. {
8. case 0:
9. printf("整除,余数为0\n"); 
10. break;
11. case 1:
12. printf("余数是1\n"); 
13. break;
14. case 2:
15. printf("余数是2\n"); 
16. break;
17. }
18. return 0;
19.}

对上述代码,假设我们输入n=3,则进入case 0,则结果为

整除,余数为0

当我们把break去掉。

1.#include <stdio.h>
2.int main()
3.{
4.int n = 0;
5.scanf("%d", &n);
6. switch(n%3)
7. {
8. case 0:
9. printf("整除,余数为0\n"); 
10.
11. case 1:
12. printf("余数是1\n"); 
13. 
14. case 2:
15. printf("余数是2\n"); 
16. 
17. }
18. return 0;
19.}

同样输入n=3,结果则为

整除,余数为0

余数是1

余数是2

所以在使用switch语句时,是否需要在case后加入break是需要读者自我把握的。

最后说一嘴,在编写case与default时,他们的顺序并不影响你的结果。对于编译器而言,他们是倒着写还是逆着写都是一样的,顺序着写入case 1,case2,default等等只是为了让代码清晰明了。

6. while循环

标准格式:

1.while(表达式)
2.    语句;//如果循环体想包含更多的语句,可以加上⼤括号

与if相似。

我们直接上例题,更便于理解。

练习:在屏幕上打印 1~10 的值:
​
1.#include <stdio.h>
2.int main()
3.{
4.     int i = 1;
5.     while(i<=10)
6.     {
7.         printf("%d ", i);
8.         i = i+1;
9.     }
10.    return 0;
11.}

7. for循环

标准格式:

1.for(表达式1; 表达式2; 表达式3)
2.     语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
相比于while循环,for的循环形式更为规整。

8. do-while循环

标准格式:

1.do{
2. 语句;
3.}while(表达式);

do...while像是人群中的劳动者,他们先干活,后判断。

while for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
所以需要注意的是,do...while至少执行一次。

9. break和continue语句

break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执行。

continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
我们举个栗子(x):
#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 if(i == 5)
 break;//当i等于5后,就执⾏break,循环就终⽌了
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

执行结果为:

1 2 3 4 

而当我们把break换为continue:

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 if(i == 5)
 continue;
 //当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
 //因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

执行结果为:

1 2 3 4 5 //此时陷入死循环

需要注意的是:

continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接 到循环的判断部分,进行下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。

10. goto语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next:
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}

执行结果为:

hehe

跳过了haha的打印

可以看出goto语句打散了我们原本的代码安排,所以我们尽量不去使用它,以免出错。

但是对于多层循环嵌套的函数,goto语句或许有奇效。


  • 45
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Squirrel-Htzsl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值