LV030-选择结构
一、if...else
1. 基本形式
if(表达式)
{
语句块1...; // 表达式为真,执行语句 1
}
else
{
语句块2...; // 表达式非真,执行语句 2
}2. 嵌套形式
if(表达式)
if(表达式) 语句块1...;
else 语句块2...;
else
if(表达式) 语句块3...;
else 语句块4...;3. 阶梯形式
if (表达式1) 语句块1...;
else if(表达式2) 语句块2...;
else if(表达式3) 语句块3...;
else if(表达式4) 语句块4...;
...
else 语句块n...;
【注意】
(1)语句块只有单条语句时, { } 可以省略,但是当有若干条语句时,必须用 { } 括起来。
(2)对于表达式,一般情况下为逻辑表达式或关系表达式;也可以是任意类型(包括整型、实型、字符型、指针类型)
(3)要注意表达式中的判断条件原则是 非 0 即为真。
(4) if 语句嵌套时, else 总是与它上面的 最近的 if 配对,与书写格式无关。要实行强行的配对关系可以利用 { } 来实现。
二、switch
1. 基本形式
switch(表达式)
{
case 常量表达式1:语句块1...;break;
case 常量表达式2:语句块2...;break;
...
case 常量表达式n:语句块n...;break;
default:语句块n+1;break; /* 放在最后时 default 后边的 break 可以省略,其他位置则不可省略 */
}
【注意】
(1)每个常量表达式的值必须 各不相同,否则将会出现矛盾。
(2)当表达式的值与 case 后面的常量表达式值(可以是 整型、字符型或者枚举型)相等时,就执行此 case 后面的语句。 case 常量: 只起语句标号的作用。另外要注意 多个 case 可以执行一组语句。
(3) switch 中的表达式可以是 整型、字符型或枚举型。
(4) break 语句用于强行跳出 switch ,一般每个 case 后面应有一个 break 语句, default 分支后的 break 可以省略。一般情况 default 分支都放在最后面,当然,也可以放在开头或者中间,但是此时的 break 就不可以省略了。
(5)语句块是可以使用花括号 { } 包裹起来的,但是大多数情况似乎都不使用花括号,但有一种情况必须要加上花括号,就是在某一个case里面定义变量的时候。
2. 可以定义变量嘛?
为什么会有这一部分笔记呢?因为踩坑了呗,先看一个实例吧:
#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;
}然后我们编译上边的程序,这个时候是不会有任何问题的,但是要是我们想在分支定义一个局部变量怎么办?我们来试一下:
#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;
}这个时候我们再来编译一下:
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 包裹在内):
case 2:
{
int a = 10;
printf("2 a=%d\n", a);
}
break;3. 多个值?
有这样的情况怎么办,有 0 1 2 三个匹配对象执行相同的语句,switch 也是支持的:
#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 中的语句啦。