1. 控制流

  • 程序语言中的控制流语句用于控制各计算操作执行的次序。

  • 根据对语句执行顺序的影响,C 语言的其余语句大多属 于以下 3 大类。

  • 选择语句 (selection statement)。if 语句和 switch 语句 允许程序在一组可选项中选择一条特定的执行路径。

  • 循环语句 (iteration statement)。while 语句、do 语句和 for 语句支持重复(循环)操作。

  • 跳转语句 (jump statement)。break 语句、continue 语句 和 goto 语句导致无条件地跳转到程序中的某个位置。(return 语句也属于此类。)

2. 选择语句

2.1 if

  1. if 语句:表达一种 如果 - 则 的条件执行关系
  2. if-else 语句:表达一种 如果 - 否则 的互斥分支关系

if 语句

1
2
3
4
5
if(a%2 == 0)
{
printf("a是偶数\n");
}

if-else 语句

1
2
3
4
5
6
7
8
9
if(a%2 == 0)
{
printf("a是偶数\n");
}
else
{
printf("a是奇数\n");
}

  • if 语句可以单独使用,else 语句不可以,else 语句必须跟 if 语句配套使用
  • 不管是 if 语句还是 else 语句,代码块都必须使用大括号 {} 括起来,否则只有首句有效

2.2 switch

  • switch 语句是一种多路判定语句,它测试表达式是否与一些常量整数值中的某一个值匹 配,并执行相应的分支动作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch (n)
{
case 1:
printf("one\n");
break;

case 2:
printf("two\n");
break;

case 3:
printf("three\n");
break;

default:
printf("其他数字\n");
}

  • switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
  • case 语句只能带整型常量,包括普通整型或字符
  • break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过 case 往下执行
  • default 语句不是必须的,一般放在最后面(因此不需要 break)

3. 循环语句

  • 循环 (loop )是重复执行其他语句(循环体)的一种语句。在 C 语 言中,每个循环都有一个控制表达式,每次执行循环体(循环重复 一次)时都要对控制 表达式求值。如果表达式为真(即值不为零),那么继续执行循环。

3.1 while

  • while 循环:先判断,再循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
while (i <= 100) // 步幅,循环跳出条件
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
/*
1.程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
2.接下来会继续判断 i<=100 是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;
执行结束后 i 的值变为 3,sum 的值变为3。
3.重复执行步骤 2
4.当循环进行到第100次,i 的值变为 101,sum 的值变为 5050;
因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码
*/

3.2 do while

  • do-while 循环:先循环,再判断
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
do
{
sum += i;
i++;
} while (i <= 100); // 注意while(i<=100);最后的分号“;”,这个必须要
printf("%d\n", sum);
return 0;
}

3.3 for

  • 上述例子中,步幅和判断条件,步进长度都被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替
1
2
3
4
5
for (表达式1; 表达式2; 表达式3)
{
语句块
}

  • “表达式 1” 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。
  • “表达式 2” 一般是一个关系表达式,决定了是否还要继续下次循环,称为 “循环条件”
  • “表达式 3” 很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得 “不成立”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1 /*语句①*/; i <= 100 /*语句②*/; i++ /*语句③*/)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
/*
1.先执行“表达式1”(i=1)
2.再执行“表达式2”(i<=100),如果它的值为真(非0),则执行循环体,否则结束循环。
3.执行完循环体后再执行“表达式3”(i++)
4.重复执行步骤2和3,直到“表达式2”的值为假,就结束循环
*/

  • for 循环中的 “表达式 1(初始化条件)”、“表达式 2(循环条件)”和 “表达式 3(自增或自减)”都是可选项,都可以省略(但分号 “;” 必须保留)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int i = 1, sum = 0;
for (; i <= 100; i++)
{
sum += i;
}
// 将 i=1 移到了for循环的外面

for (i = 1;; i++)
sum = sum + i;
// 省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环

for (i = 1; i <= 100;)
{
sum = sum + i;
i++;
}
// 省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句

4. 跳转语句

  • 使用 while 或 for 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或 continue 关键字

4.1 break

  • 当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main()
{
int i = 0, j = 0, sum = 0;
while (1) // 循环条件为死循环
{
sum += i;
i++;
if (i > 100)
break;
while (j < 50)
{
j++;
break;
}
}
printf("%d\n", sum); // 5050
printf("%d\n", i); // 101
printf("%d\n", j); // 50
return 0;
}

  • 在多层循环中,一个 break 语句只向外跳一层

4.2 continue

  • continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue 语句只用在 while、for 循环中,常与 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
#include <stdio.h>
int main()
{
char c = 0;
while (c != '\n') // 回车键结束循环
{
c = getchar();
if (c == '4' || c == '5') // 按下的是数字键4或5
{
continue; // 跳过当次循环,进入下次循环
}
putchar(c);
}
return 0;
}
==>
0123456789
01236789
/*
本例我们输入的是 0123456789,当读取到4或5时,if的条件 c=='4'||c=='5' 成立,
就执行 continue 语句,结束当前循环,直接进入下一次循环,也就是说 putchar(c); 不会被执行到。
而读取到其他数字时,if的条件不成立,continue 语句不会被执行到,
putchar(c);就会输出读取到的字符。
*/

  • break 与 continue 的对比:

  • break 用来结束所有循环,循环语句不再有执行的机会;

  • continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

4.3 goto

  • goto 语句直接跳转到本代码块中的标签处
  • 标签指的是以冒号结尾的标识符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
printf("%d\n", __LINE__); // 打印第4行

// 无条件跳转到label处
goto label;
printf("%d\n", __LINE__); // 打印第8行,此处被略过
label:
printf("%d\n", __LINE__); // 打印第10行
return 0;
}
==>
4
10

  • goto 语句常被用在程序的错误处理中
  • goto 语句的无条件跳转不利于程序的可读性,一般不建议使用

5. 循环嵌套

  • 在 C 语言中,if-else、while、do-while、for 都可以相互嵌套。所谓嵌套,就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,while 里面有 if-else,这都是允许的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 4; i++) // 外层for循环
{
for (j = 1; j <= 4; j++) // 内层for循环
{
printf("i=%d, j=%d\n", i, j);
}
printf("\n");
}
return 0;
}
// 本例是一个简单的for循环嵌套,外层循环和内层循环交叉执行,外层for每执行一次,内层for就要执行四次。

原文地址 zhuanlan.zhihu.com