C 流程控制语句


流程控制语句指定计算执行的顺序。


流程控制语句分类

C语言提供了3种类型的流程控制语句。

  • 决策语句,包含if、switch语句。
  • 循环语句,包含for、while、do-while语句。
  • 分支语句,包含break、continue、return、goto语句。

if语句

if-else语句用于表示决策。

if-else的格式如下:

if(表达式1) {
  语句块1
} else if (表达式2) {
  语句块2
}
...
else {
  语句块3
}

else ifelse部分都是可选的。else if可以有多个。

if语句执行过程:

计算表达式1的值,如果为true(表达式1的值为非0值),则执行语句块1,终止if语句。否则,计算表达式2的值,如果为true,则执行语句块2,终止if语句。如果表达式1表达式2都为false(值为0),则执行语句块3,终止if语句。

C语言中没有bool类型,以数字型的0为false,非0值表示true。

下面是if语句的例子。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int i = 1;

    if (i)
        printf("i is true \n" );  // i is true

    if (i > 1)
        printf("i > 1 \n" );
    else
        printf("i <= 1 \n" );   // i <= 1

    if (i > 10)
        printf("i > 10 \n" );
    else if (i >= 0 && i <= 10)
        printf("i >= 0 and i <= 10 \n" ); // i >= 0 and i <= 10
    else
        printf("i < 0 \n" );

    return 0;
}

if语句只会执行多个语句块中的其中一个语句块,即只执行第一个值为true的表达式后面的语句块,如果所有表达式都为false,则执行语句块3

switch语句

switch语句判断指定表达式是否匹配多个整型常量表达式中的一个,并执行对应的分支。

switch语句的形式:

switch(表达式1) {
  case 表达式2 : 语句2; break;
  case 表达式3 : 语句3; break;
  ...;
  default : 语句4; break;
}

break语句是可选的。

switch语句的执行过程:

  1. 计算表达式1的值(表达式1的值可以为byte、short、int、char和枚举等整数类型)。
  2. 比较表达式1的值和表达式2的值,如果相等,则执行表达式2后面的语句,直到碰到break语句,终止switch语句。否则,比较表达式1的值和表达式3的值,如果相等,则执行表达式3后面的语句,直到碰到break语句,终止switch语句。
  3. 如果表达式1的值和所有case的表达式的值都不相等,则执行default后面的语句。

下面是switch语句的例子。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int i = 2;
    char fruit = 'a';
    switch (i) {
        case 1:
            printf("i = 1 \n");
            break;
        case 2:
            printf("i = 2 \n");   // i = 2
            break;
        default:
            printf("i is unknown \n");
    }

    // 没有break语句
    switch (fruit) {
        case 'a':
            printf("apple \n");   // apple
        case 'b':
            printf("banana \n");  // banana
        default:
            printf("unknown fruit");  // unknown fruit
    }

    return 0;
}

switch语句可能会执行case中的多个语句块,直到碰到break语句或已经到了switch语句的结束位置。

while和do-while语句

while语句形式:

while(表达式1) {
  语句1
}

do-while语句形式:

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

while语句的执行过程:

  1. 计算表达式1的值,如果为非0值,则执行语句1;否则,终止while语句。
  2. 重复步骤1。

do-while语句的执行过程:

  1. 执行语句2
  2. 计算表达式2的值,如果为非0值,则执行语句2;否则,终止do-while语句。
  3. 重复步骤2。

下面是while语句和do-while语句的例子。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int i = 3;
    int j = 3;

    while(i-- > 0)
         printf("%d ", i);  // 2 1 0

    printf("\n");
    do {
         printf("%d ", j);  // 3 2 1 0 
    } while (j-- > 0);

    return 0;
}

for语句

for语句形式:

for(初始化语句; 表达式1; 语句1) {
  语句2
}

for语句执行过程:

  1. 首先执行初始化语句
  2. 计算表达式1的值,如果值为0,终止for语句。否则,执行语句2,然后执行语句1(语句1常用于增加或减少一个变量的值)。
  3. 重复步骤2。

下面是for语句的例子。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    for (int i = 0; i < 3; i++)
        printf("%d ", i);   // 0 1 2 

    return 0;
}

break语句

break语句用于提前终止for和while循环。break语句终止最里层的循环。

下面是break语句的例子。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int arr[] = { 1, 2, 3 };
    int len = sizeof(arr) / sizeof(int);

    for (int i = 0; i < len; i++) {
        printf("arr[%d] = %d \n", i, arr[i]); // 1 2
        if (arr[i] == 2) {
            printf("arr contains 2 \n");  // arr contains 2 
            break;
        }
    }

    return 0;
}

continue语句

continue语句跳过当前这次循环,进入到下次循环。

下面是continue语句的例子。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int arr[] = { 1, 2, 3 };
    int len = sizeof(arr)/sizeof(int);

    for (int i = 0; i < len; i++) {
        if (arr[i] == 2) {
            printf("arr contains 2. \n");   // arr contains 2
            continue;
        }
        printf("arr[%d] = %d \n", i, arr[i]); // 1 3
    }

    return 0;
}

goto语句和标识符

goto语句用于将控制转移到指定的标识符处继续执行。

下面是goto语句的例子:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int arr[][4] =  { { 1, 2, 3, 4}, {2, 4, 6, 8}, { 3, 6, 9, 12 } };
    int row = 3;
    int col = 4;

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++) {
            printf("arr[%d][%d] = %d \n", i, j, arr[i][j]);   // 1 2 3
            if (arr[i][j] == 3) {
                goto get3;
            }
        }

    printf("arr doesn't contains 3. \n");
    return 0;

get3:
    printf("arr contains 3. \n");   // arr contains 3.

    return 0;
}