摘要:
  本文主要是记录C语言笔记——控制语句。

一、顺序结构

  先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。

image-20220125194507922

二、选择结构

1.if...else...

  • 基本形式
1
2
3
4
5
6
7
8
if(表达式)
{
语句块1...; // 表达式为真,执行语句1
}
else
{
语句块2...; // 表达式非真,执行语句2
}
image-20220125195352926
  • 嵌套形式
1
2
3
4
5
6
7
if(表达式)
if(表达式) 语句块1...;
else 语句块2...;
else
if(表达式) 语句块3...;
else 语句块4...;

  • 阶梯形式
1
2
3
4
5
6
if (表达式1) 语句块1...;
else if(表达式2) 语句块2...;
else if(表达式3) 语句块3...;
else if(表达式4) 语句块4...;
...
else 语句块n...;
image-20220125200142589

【注意】

  (1)语句块只有单条语句时,{ }可以省略,但是当有若干条语句时,必须用{ }括起来。

  (2)对于表达式,一般情况下为逻辑表达式或关系表达式;也可以是任意类型(包括整型、实型、字符型、指针类型)

  (3)要注意表达式中的判断条件原则是非0即为真

  (4)if语句嵌套时,else总是与它上面的最近的if配对,与书写格式无关。要实行强行的配对关系可以利用{ } 来实现。

2.switch

  • 基本形式
1
2
3
4
5
6
7
8
switch(表达式)
{
case 常量表达式1:语句块1...;break;
case 常量表达式2:语句块2...;break;
...
case 常量表达式n:语句块n...;break;
default:语句块n+1;break; /* 放在最后时default后边的break可以省略,其他位置则不可省略 */
}
image-20220125203408073

【注意】

(1)每个常量表达式的值必须各不相同,否则将会出现矛盾。

(2)当表达式的值与case后面的常量表达式值(可以是整型、字符型或者枚举型)相等时,就执行此case后面的语句。case 常量:只起语句标号的作用。另外要注意多个case可以执行一组语句

(3)switch中的表达式可以是整型、字符型或枚举型

(4)break语句用于强行跳出switch,一般每个case后面应有一个break语句,default分支后的break可以省略。一般情况default分支都放在最后面,当然,也可以放在开头或者中间,但是此时的break就不可以省略了。

三、循环结构

1.while

1.1基本形式

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

  先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while整体 后面的代码。

image-20220125205217591

1.2实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(int argc, char *argv[])
{
int n = 5;
int count = 0;
printf("------cycle start------\n");
while(n > 2)
{
printf("Before statement execution: count=%d, n=%d\n", count, n);
n--;
count++;
printf("After statement execution: count=%d, n=%d\n", count, n);
}
printf("------cycle end------\n");
printf("count = %d, n = %d \n", count, n);
return 0;
}
image-20220125205922983

【注意】while循环是先判断表达式为真,然后才执行循环,若为假,则直接结束循环,不会再执行循环体内的语句块。

2.do...while

2.1基本形式

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

  先执行“语句块”,再计算“表达式”的值,当值为真(非0)时,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 do...while 整体后面的代码。

image-20220125210700859

2.2实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(int argc, char *argv[])
{
int n = 5;
int count = 0;
printf("------cycle start------\n");
do{
printf("Before statement execution: count=%d, n=%d\n", count, n);
n--;
count++;
printf("After statement execution: count=%d, n=%d\n", count, n);
}while(n > 5);
printf("------cycle end------\n");
printf("count = %d, n = %d \n", count, n);

return 0;
}
image-20220125211932332

【注意】do...while循环是先执行一次循环,然后才判断表达式为真,然后才继续执行循环,若为假,则直接结束循环,不会再执行循环体内的语句块。所以当两个实例中的判断条件n > 2变为n > 5while循环结构一次也不执行,而do...while循环结构会执行一次,这点需要注意。

3.for

3.1基本形式

1
2
3
4
for(表达式1; 表达式2; 表达式3)
{
语句块...;
}

执行过程:

  (1) 先执行“表达式1”。

  (2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。

  (3) 执行完循环体后再执行“表达式3”。

  (4) 重复执行步骤 (2) 和 (3),直到“表达式2”的值为假,就结束循环。

  上面的步骤中,(2) 和 (3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 (2) 和 (3)。

image-20220126111212925

【注意】

  (1)“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式1”可省略,但循环之前应给循环变量赋值

  (2)表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式2”可省略,将陷入死循环

  (3)“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。“表达式3”可省略,但在循环体中增加使循环变量值改变的语句

四、辅助控制语句

1.return

1.1基本形式

1
return (表达式); /* 有没有 ( ) 都可以*/

1.2基本应用

  • 返回函数的值

  当return应用在函数中时,可以用于返回一个值,如return (10 + 9);

  • 结束程序

  当return应用在函数中时,不仅可以用于返回一个值,还可以直接结束该函数,return语句执行完毕,它后边的所有语句不再执行,直接跳到主函数继续执行,若是用在主函数中,则遇到return直接结束主函数,整个程序结束,后边的语句不再执行。

【注意】 return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值(少数的编程语言支持多个返回值,例如Go语言)。

2.goto

  goto 语句是一种无条件流程跳转语句,通常 goto 语句与 if 语句结合使用,当满足一定条件时,程序流程跳转到指定标号处,接着往下执行。

2.1基本形式

1
2
3
4
5
6
/* 定义一个语句标识 flag_name (flag_name只是一个名字)*/
flag_name : /* 语句标识后的冒号不能省略 */
语句块...;

/* goto 语句的调用 */
goto flag_name; /* 程序将从对应 flag_name 的代码处开始往下执行。 */

【注意】flag_name后边的语句可以加{ },也可以不加。不过加上的话可读性会强一些。

2.2基本应用

  • 跳出循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main(int argc, char *argv[])
{
int count = 0;
flag:
{
printf("------goto statement execution------\n");
printf("------cycle end------\n");
printf("count = %d\n", count);
if (count == 3)
return 0;
}
printf("------while cycle start------\n");
while(1)
{
printf("Before statement execution: count=%d\n", count);
count++;
printf("After statement execution: count=%d\n", count);
if(count > 3)
goto flag;
}
return 0;
}
image-20220126133428798

  goto flag_name;语句放在循环中用于跳出循环,用于结束循环时,此时flag_name处的代码有两种情况:

(1)第一种是放在循环上边,比循环先执行,这个时候,flag_name处的程序会先执行一遍,所以,切记,这里边不要直接放return语句,否则程序直接结束了,有需要的话可以加一个判断,以保证程序可以正常运行。

(2)第二种是放在循环下边,这个时候,只有满足了跳转指令时,程序才会跳转到flag_name处执行。

  • 构成循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 1;
int sum=0;
flag:
if(i <= 5)
{
sum = sum + i;
i++;
goto flag;
}
printf("%d\n",sum);
return 0;
}

3.break

3.1基本形式

1
break;

  break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。

  当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句联在一起,即满足条件时便跳出循环。

3.2基本应用

  • 跳出一层循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main(int argc, char *argv[])
{
int n,i;
printf("自数1~100全部素数:\n");
for(n = 2; n <= 100; n++)
{
for(i = 2; i < n; i++)
{
if (n % i == 0)
break;
}
if(i >= n)
printf("%d\t",n);
}
printf("\n");
return 0;
}
image-20220126134630921

【注意】

  (1)break语句对if-else的条件语句不起作用;

  (2)在多层循环中,一个break语句只向外跳一层。

4.continue

4.1基本形式

1
continue;

  continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环

4.2基本应用

  • 直接跳过剩余语句执行下一次循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
for(n = 1; n <= 30; n++)
{
if(n % 2 == 0)
continue;
printf("%d\t", n);
}
printf("\n");
return 0;
}

image-20220126140539529