C语言学习顺序结构,选择结构
前言:C语言是一门“结构化”的程序设计语言
结构化指的就是:顺序结构,选择结构,循环结构
“语句”指的是用分号隔开的被称为语句
在C语言中,0为假,非0为真。
表达式包含“条件表达式”“逻辑表达式”
条件表达式例如:a>=5,a==5
逻辑表达式例如:a>=18 && a<=60 (a大于等于18且a小于等于60)
#include<stdio.h> int main() { int a = 0;//这是一条语句 ;//这是一条语句,被称为空语句 return 0;//这是一条语句 }
1.顺序结构
“顺序结构”顾名思义指的是语句的执行顺序是由上至下的,是最简单的一种结构。
#include<stdio.h> int main() { int a = 5; printf("a = %d\n", a);//a = 5 int b = 6; printf("b = %d\n", b);//b = 6 a = b; printf("转换后a = %d\n", a); //转换后a = 6 //从上到下依次执行语句,这是顺序结构,通常作为程序的一部分 return 0; }
2.选择结构(分支结构)
当程序需要进行选择的时候,就会出现分支,不同的分支往往指向的结果不同,在进行选择的时候包含“if”语句和“switch”语句
(1)“ if ”语句
1.“ if ”语句有三种表达形式:
第一种:if
if(条件)语句---指的是如果条件为真就执行语句,如果为假就不执行该语句
#include<stdio.h>
int main() {
int age = 25;
if (age <= 18)
printf("未成年\n");
printf("成年人\n");//输出结果为:成年人
//在该例中,条件判断的是年龄小于18岁,就输出未成年,但年龄初始化为25,所以直接跳过,执行下一语句
return 0;
}
第二种:if-else
if(条件)
语句1
else 语句2---指的是如果条件为真就执行第一条语句,否则就执行第二条语句
#include<stdio.h>
int main() {
int age = 25;
if (age <= 18)
printf("未成年\n");
else
printf("成年人\n");//输出结果为成年人
//在该例子中,进行判断时是年龄是否小于18岁,小于18岁输出未成年,否则输出成年人
return 0;
}
第三种:if-else if
if(条件1)
语句1
else if(条件2)
语句2
else if (条件3)
语句3
.......---指的是如果条件为真就执行第一条语句,否则就执行第二个判断式,如果为真就执行第二条语句,否则就执行第三个判断式,如果为真......
#include<stdio.h>
int main() {
int age = 100;
if (age <= 18)
printf("未成年\n");
else if(18<age && age<=60)
printf("成年人\n");
else if(60<age && age<=90)
printf("普通老人\n");
else
printf("长寿老人\n");//输出结果为长寿老人
//年龄初始化为100岁,根据判断输出结果
return 0;
}
2.为什么建议加上{}(代码块)
不加上的后果:
#include<stdio.h>
int main() {
int age = 12;
if (age <= 18)
printf("未成年\n");
printf("童年");//此处会报错,因为在if语句无法匹配多个语句,只能识别一个
else
printf("成年人\n");
return 0;
}
在加上代码块后:
#include<stdio.h>
int main() {
int age = 12;
if (age <= 18) {
printf("未成年\n");
printf("童年\n");
}
else {
printf("成年人\n");
}
return 0;
}
3.悬空else问题
#include<stdio.h>
int main() {
int a = 10;
if (a <= 5)
if (a > 5)
printf("hehe");
else
printf("haha");
return 0;
}
在这个问题中由于没有加入代码块,可能会产生误解,大部分初学者会认为输出为“haha”,其实什么都不输出,原因是因为“else”是跟随最近的“if”而运行的
再加入代码块后会更加直观:
利用代码块也可以解决这类问题:
4.对表达式的一些补充
在C语言中,用“1”表示为真,“0”表示为假,当表达式出现表示范围的错误时,就会出现不易察觉的bug
#include<stdio.h>
int main() {
int age = 100;
if (age <= 18) {
printf("未成年\n");
}
else if (18<age<=60){//关系表达式可知100大于18是真的,表示为“1”,1<=60,是正确的,所以输出结果为“成年人”
printf("成年人\n");
}
else
printf("老人\n");
return 0;
}
(2).“switch”语句
“switch”语句常用于多分支语句
switch(整型表达式){
语句项
}
语句项---
例如:case 整型常量表达式:
语句;
整型表达式---只要是整型即可
整型常量表达式---既要是整型,又要是常量
1.关于“switch”中的“break”和“default”关键字
“break”是用于跳出“switch”语句的关键字
没有加上“break”的后果:
加上“break”后:
“default”关键字就是“默认”的意思,当输入的值与“case”所对应的值都不对应时,超出“case”的范围时,用到“default”关键字
2.”switch“比“if”更适合多分支
下面以输入1-7以输出星期1至星期日为例:
“if”语句:
#include<stdio.h>
int main() {
int a = 0;
scanf("%d",&a);
if (1 == a) {
printf("星期一\n");
}
else if (2 == a) {
printf("星期二\n");
}
else if (3 == a) {
printf("星期三\n");
}
else if (4 == a) {
printf("星期四\n");
}
else if (5 == a) {
printf("星期五\n");
}
else if (6 == a) {
printf("星期六\n");
}
else if (7 == a) {
printf("星期日\n");
}
else {
printf("输入错误\n");
}
return 0;
}
“switch”语句:
#include<stdio.h>
int main() {
int a = 0;
scanf("%d",&a);
switch (a) {
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:
printf("输入错误\n");
break;
}
return 0;
}
虽然看上去“if”和“switch”差不多,但实际上不管复制粘贴还是逻辑简便方面“switch”都比“if”更好
3.case穿透
正常情况下:
#include<stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
switch (a) {
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:
printf("输入错误\n");
break;
}
return 0;
}
在case穿透后:
#include<stdio.h>
int main() {
int a = 0;
scanf("%d", &a);
switch (a) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
结果是一样的,很明显,case穿透更方便