Skip to content

LV030-选择结构

一、if...else

1. 基本形式

c
if(表达式)
{
    语句块1...;     // 表达式为真,执行语句 1
}
else
{
    语句块2...;    // 表达式非真,执行语句 2
}
image-20220125195352926

2. 嵌套形式

c
if(表达式)
 	 if(表达式)    语句块1...;
	 else 	      语句块2...;
else	
	 if(表达式)    语句块3...;
	 else	      语句块4...;

3. 阶梯形式

c
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 配对,与书写格式无关。要实行强行的配对关系可以利用 { } 来实现。

二、switch

1. 基本形式

c
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 就不可以省略了。

(5)语句块是可以使用花括号 { } 包裹起来的,但是大多数情况似乎都不使用花括号,但有一种情况必须要加上花括号,就是在某一个case里面定义变量的时候。

2. 可以定义变量嘛?

为什么会有这一部分笔记呢?因为踩坑了呗,先看一个实例吧:

c
#include <stdio.h>

/* 主函数 */
int main(int argc, char *argv[])
{
	int n = 1;
	switch(n)
	{
		case 1:
			printf("1\n");
			break;
		case 2:
			printf("2\n");
			break;
		default:
			printf("default\n");
			break;
	}
	
	return 0;
}

然后我们编译上边的程序,这个时候是不会有任何问题的,但是要是我们想在分支定义一个局部变量怎么办?我们来试一下:

c
#include <stdio.h>

/* 主函数 */
int main(int argc, char *argv[])
{
	int n = 1;
	switch(n)
	{
		case 1:
			printf("1\n");
			break;
		case 2:
			int a = 10;
			printf("2 a=%d\n", a);
			break;
		default:
			printf("default\n");
			break;
	}
	
	return 0;
}

这个时候我们再来编译一下:

shell
hk@vm:~/6temp/test$ gcc test.c -Wall
test.c: In function ‘main’:
test.c:13:4: error: a label can only be part of a statement and a declaration is not a statement
    int a = 10;
    ^

我们发现,居然报错了,原因上边其实已经提示了,在 c 语言中想要在 switch 语句的某一个分支中定义变量,我们需要加上为这分支加上花括号。将上边报错的分支修改为如下的形式(花括号也可将 break 包裹在内):

c
case 2:
		{
			int a = 10;
			printf("2 a=%d\n", a);
		}
		break;

3. 多个值?

有这样的情况怎么办,有 0 1 2 三个匹配对象执行相同的语句,switch 也是支持的:

c
#include <stdio.h>

/* 主函数 */
int main(int argc, char *argv[])
{
	int n = 2;
	switch (n)
	{
        case 1:
        case 2:
            printf("2\n");
            break;
        default:
            printf("default\n");
            break;
	}

	return 0;
}

这样 n 是 1 或者 2 的时候都会执行分支 2 中的语句啦。