分支 if、switch、break、continue 的用法
分支结构
分类:
if语句
1、if最简单的用法
格式:
if (表达式)
语句
功能:
如果表达式为真,语句执行
如果表达式为假,语句不执行
2、if的范围问题
(1)if (表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行,或者讲,语句B一定会执行
(2)if (表达式)
{
语句A;
语句B;
}
此时if可执行语句A和语句B
由此可见:if 默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来
3、if…else…的用法
…… //其他语句
if(表达式)
{
…… //逻辑值为真所执行的语句、程序块
}
else
{
…… //逻辑值为假所执行的语句、程序块
}
…… //其他语句
4、if…else… if…else…的用法
格式:
if (1)
A;
else if(2)
B;
else if (3)
C;
else
D;
5、C语言对真假的处理
非零是真
零就是假
真用1表示
假用0表示
6、if 的常见问题解析
1、空语句的问题
if ( 3 > 2);
等价于
if ( 3 > 2)
; //这是一个空语句
2、
if(表达式1)
A;
else
B;
是正确的
if(表达式1) ; //后面如果加分号,则默认if 后面是一个空语句
A;
else
B;
是错误的
3、
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else
D;
即使表达式1和2都成立,也只会执行A语句
4、
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
语法上没有错误,但是逻辑上有漏洞
5、
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else (表达式4) // 7行
D;
语法上有错误,正确的写法是:
要么去掉7行的(表达式4)
要么在else 后面加 if
6、
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else (表达式4);
D;
语法上无错误,但逻辑上是错误的
等价于
else
(表达式4);
D;
switch语句
if是条件判断,switch是判断选择
格式:
……//语句
switch(表达式)
{
case 常量表达式1:
语句或程序块1
break;
case 常量表达式2:
语句或程序块2
break;
……
case 常量表达式n:
语句或程序块n
break; //终止switch
default: //这是默认的
语句或程序块n+1
}
……//其他语句
注意:
(一)所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是:
(1)枚举常量(枚举元素)
(2)数值常量
(3)字符常量
(4)常变量
(5)宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的。
(二)switch后面括号里的表达式允许是任何类型
但是VC++中只允许为int或者char类型
(三)执行完一个case语句后,流程控制就转移到下一个case子句继续执行。
“case”常量表达式只是起语句标号的作用,并不是在该处进行条件判断。
在执行switch语句时,根据switch( )中表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。
case之间与default没有顺序,先判断所有的case,没有匹配的case执行default。
(四)switch是选择不是循环,在switch语句中出现break语句,功能只是退出switch语句转去执行下一条语句;
switch中不能出现continue,除非switch本身就属于for或while循环的一部分。
break和continue
break
break如果用于循环是终止循环
break用于switch,则使用了终止switch
break不能直接用于if,除非if属于循环内部的一个子句
例子:
break 虽然是 if 内部语句,但是是用来终止外部 for 循环的
for (i=0; i<3; ++i)
{
if (3>1)
break;
printf("222!\n"); //永远不会输出
}
在多层循环中,break 只能终止距离它最近的循环
for (i=0; i<4; ++i)
{
for (j=1; j<4; ++j)
break;
printf("您很厉害!\n");
}
在DEVC++中输出的结果是
----------------------
您很厉害!
您很厉害!
您很厉害!
您很厉害!
----------------------
多层switch嵌套中,break 只能终止距离它最近的一个switch
{
int x=1,y=0,a=0,b=0;
switch (x) //第一个 switch
{
case 1:
switch (y) //第二个switch
{
case 0:
a++;
break; //终止的是第二个switch
case 1:
b++;
break;
}
b = 100;
break;
case 2:
a++;
b++;
break;
}
printf("%d %d",a,b);
在DEVC++中输出的结果是
--------------------
1 100
--------------------
continue
用于跳过本次循环余下的语句
转去判断是否需要执行下次循环
例子:
1、
for (1;2;3)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后,会执行语句3,C和 D都不会执行
C;
D;
}
2、
while (1;2;3)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后,会执行表达式,C和 D都不会执行
C;
D;
}
3、scanf对用户非法输入的处理 (详见代码)
# include <stdio.h>
int main (void)
{
int i;
char ch;
scanf("%d",&i);
printf("i = %d\n",i);
while ( (ch=getchar()) != '\n')
continue; //过滤不合法数据
int j;
scanf("%d",&j);
printf("j = %d\n",j);
return 0;
}
在DEVC++中输出的结果是
----------------------
2ddesj
i = 2
3degb
j = 3
--------------------------------