C语言02-分支和循环12
本章重点
分支语句
循环语句
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
| if (condition) { return x; } return y;
if (condition) { return x; } else { return y; }
int num = 1; if (num == 5) { printf("hehe\n"); }
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-5,输出的是“工作日”;
- 输入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
| #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
| #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
| #include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; }
#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
| #include <stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) break; printf("%d ", i); } return 0; }
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
| #include <stdio.h> int main() { int i = 1; do { if (5 == i) break; printf("%d ", i); i = i + 1; } while (i <= 10); return 0; }
#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; }
|