选择结构和条件判断
(一)if语句——实现两个分支
if 语句可以写成不同形式
- if (表达式) 语句1——可以没有else语句
- if (表达式)
语句 1
else
语句 2
——————————有else语句 - if (表达式 1) 语句 1
else if (表达式 2) 语句 2
else if (表达式3) 语句 3
… …
———————————可以使用嵌套
注意:
(1)如果语句 1,语句 2,,,是复合语句,应该使用花括号括起来。即写成一个代码块。
(2)内嵌语句可以是 if 语句 ,如果不使用花括号的话, else与最近的 if 相匹配。最好写成代码块形式。
举例如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0;
int b = 1;
if (1 == a)
if (b == 1)
printf("bbbbbb");
else
printf("aaaaaa"); //主观感觉输出应该为aaaaaa,
//实际上else与最近的if相匹配,所以什么也不输出
system("pause");
return 0;
}
运行结果如下:
(3)if语句后的表达式如果是判断表达式中的等于的话,最好将用于比较的值放在左边,防止写成赋值表达式。这样的话写错的话容易报错。
如:
int main()
{
int a = 0;
if (0 == a) //如 此处如果写 a == 0的话就容易写成 a = 0
printf("%d", a);
system("pause");
return 0;
}
(4)C语言中0表示假,非0表示真。
所以if 后面的表达式可以是一个变量。
(5)if语句的书写规范
- bool值和0比较
bool表示真假,只有 true 和 false
在C语言中bool值的语义是 0为假,非0为真,true和false这些标识符在C中一定会被定义为一个固定值。
flag是个整数,可以被赋值为非0整数表示真。
在表达式中不能写成 if(flag == true)
原因是:如果flag本身是5,非0,表示真,true为3的话,flag == true为假,则表达式假。
错误代码如下:
int flag;
if (flag == TRUE);
{
printf("TRUE");
}
if (flag == FALSE)
{
prirntf("FALSE");
}
正确 形式应该为
if (flag);
{
printf("TRUE");
}
if (!flag)
{
prirntf("FALSE");
}
- 整型变量和0比较
如果一个变量就是整型,(不表示真假)则这个数不能和0比较
int num = 0;
//正确写法
if(0 == num)
//错误写法
if(num) //如果num本身是0的话,则该语句判断为假,就不能执行if语句
(5)if(表达式1)语句 1 else 语句 2
等价于
表达式1 ? 表达式 2 : 表达式3
举例代码如下:
int main()
{
int max = 0;
int a = 1;
int b = 2;
if (a > b)
{
max = a;
}
else
{
max = b;
}
system("pause");
return 0;
}
该代码等价于以下代码
int main()
{
int max;
int a = 1;
int b = 2;
max = (a > b) ? a: b;
system("pause");
return 0;
}
(二)switch语句——实现多分支
switch语句的一般形式
switch(表达式)
{
case 常量1:语句 1
case 常量2:语句 2
case 常量3:语句 3
…
default : 语句n
}
· switch 后面的表达式为整数类型,包括字符型,不能为字符串。
· case 后面可以跟一个常量或常量表达式,用来标志一个位置。
执行switch语句时,先计算表达式的值,然后将该值与case后的标号比较,如果相同,则转到该case后的语句,如果不相同,则与后一个case判断,如果没有相匹配的case,则执行default标号后的语句。
·可以没有default语句,如果没有相匹配的case,则执行switch后的下一个语句。
· 各case标号与default标号顺序没有影响。
· 每一个case常量必须不相同,不能出现一个表达式的值有两种及以上执行方案。
· 一般,每个case子句后,应该用一个break语句跳出switch结构。
否则会一直执行下去。
举例如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("今天是星期一\n");
break;
case 2:
printf("今天是星期二\n");
break;
case 3:
printf("今天是星期三\n");
break;
case 4:
printf("今天是星期四\n");
break;
case 5:
printf("今天是星期五\n");
break;
case 6:
printf("今天是星期六\n");
break;
case 7:
printf("今天是星期天\n");
break;
default:
break;
}
system("pause");
return 0;
}
运行结果如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("今天是星期一\n");
case 2:
printf("今天是星期二\n");
case 3:
printf("今天是星期三\n");
case 4:
printf("今天是星期四\n");
case 5:
printf("今天是星期五\n");
case 6:
printf("今天是星期六\n");
case 7:
printf("今天是星期天\n");
default:
;
}
system("pause");
return 0;
}
运行结果如下
· 多个case标号可以公用一个执行语句
举例如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("今天是工作日\n");
break;
case 6:
case 7:
printf("今天是休息日\n");
break;
default:
break;
}
system("pause");
return 0;
}
运行结果如下