C语言02-分支和循环12

C语言02-分支和循环12

本章重点

分支语句

  • if
  • switch

循环语句

  • while
  • for
  • do while

goto语句

1 分支语句

1.1 if语句

语法结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(表达式)
语句;

if(表达式)
语句1;
else
语句2;

//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;

1.2.1 悬空else

首先看一下代码,运行结果为什么:

1
2
3
4
5
6
7
8
9
10
11
12
#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的匹配-else是和它离的最近的未匹配的if进行匹配。

若想输出haha,则为一下写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}

1.2.2 if书写形式的对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//代码1
if (condition) {
return x;
}
return y;

//代码2
if (condition)
{
return x;
}
else
{
return y;
}

//代码3
int num = 1;
if (num == 5)
{
printf("hehe\n");
}

//代码4
int num = 1;
if (5 == num)
{
printf("hehe\n");
}

代码1,代码2都表示:条件成立返回x,不成立返回y,但是代码2格式更好。

代码3,代码4相同,但是代码4格式更好。因为,代码3中的 num == 5 有时候会误写成一个等号,为了避免这种错误,可将代码反过来写,写成 5 == num

1.2 switch语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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;
}

注意:

1
2
3
4
5
6
7
switch(整型表达式)
{
语句项;
}

case 整形常量表达式:
语句

switch 后是整型表达式,case 后是整形常量表达式。

1.2.1 case穿透

有时候我们的需求变了:

  1. 输入1-5,输出的是“工作日”;
  2. 输入6-7,输出“休息日”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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;
}
return 0;
}

在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

1.2.2 default字句

switch 表达式的值并不匹配所有case 标签的值时,这个default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

2 循环语句

2.1 while循环

while语句执行的流程:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}

2.1.1 while语句中的break和continue

break介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;

printf("%d ", i);
i = i + 1;
}
return 0;

}

结果: 1 2 3 4

总结:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以,while中的break是用于永久终止循环的

continue介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}

结果:1 2 3 4
但是此处死循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 0;
while (i <= 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);

}
return 0;
}

结果:1 2 3 4 6 7 8 9 10 11

总结:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行
而是直接跳转while语句的判断部分。进行下一次循环的入口判断。

2.1.3 清空缓冲区

1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != '\n')
return 0;
}

其他:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.

//代码2
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

2.2 for循环

2.2.1 语法

1
2
3
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}

2.2.2 break和continue在for循环中

for循环中break和continue的意义和在while循环中是一样的。
但是还是有些差异:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}

//代码2
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}

代码1结果:1234
代码2结果:1 2 3 4 6 7 8 9 10 但是没有死循环

2.3 do…while()循环

2.3.1 语法

1
2
3
4
5
do
{
循环语句;
}
while(表达式);


循环至少执行一次,使用的场景有限,所以不是经常使用。

2.3.2 do while循环中的break和continue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 代码1
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}

// 代码2
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}

代码1结果:1 2 3 4
代码2结果:1 2 3 4 死循环

3 练习

3.1 折半查找算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int key = 7;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
break;
}
if (left <= right)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
return 0;
}

C语言02-分支和循环12
https://blog.966677.xyz/2023/09/02/C语言02-分支和循环12/
作者
Zhou1317fe5
发布于
2023年9月2日
许可协议