选择结构和条件判断
(一)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");elseprintf("aaaaaa"); //主观感觉输出应该为aaaaaa,//实际上else与最近的if相匹配,所以什么也不输出system("pause");return 0;
}
运行结果如下:
(3)if语句后的表达式如果是判断表达式中的等于的话,最好将用于比较的值放在左边,防止写成赋值表达式。这样的话写错的话容易报错。
如:
int main()
{int a = 0;if (0 == a) //如 此处如果写 a == 0的话就容易写成 a = 0printf("%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;
}
运行结果如下