19-1 概览
分支语句:if、switch
循环语句:while、for、do while
goto语句
以上都属于控制语句
19-2 语句的分类
C语句可分为以下五类:
表达式语句、函数调用语句、控制语句、复合语句、空语句
19-3 结构
C语言是结构化的程序设计语言
顺序结构:
选择结构:if、switch
循环结构:for、while、do while
19-4 控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,可分为以下三类:
1、条件判断语句也叫分支语句:if语句、switch语句;
2、循环执行语句: do while语句、while语句、for语句;
3、转向语句: break语句、goto语句、continue语句、return语句。
19-5 分支语句(选择结构)
19-5-1 if语句
语法结构:
if (表达式)语句;if (表达式)语句1;
else语句2;//多分支
if (表达式1)语句1;
else if (表达式2)语句2;
else语句3;
注:if语句默认控制一条语句,如果后面跟多条语句,要跟上{};else同理
猜猜会输出什么?
int main()
{int age = 10;if(18<=age<28){printf("青年\n");}return 0;
}
运行结果:
为什么10不在这个范围内,还能输出“青年”呢?
因为编译器从左往右判断:18<=age,不正确,为假,所以为0;0<28,正确,所以执行
注意:C语言中0为假,非0为真
所以我们应该这样写:
int main()
{int age = 10;if(18 <= age && age < 28){printf("青年\n");}return 0;
}
不再输出了:
代码块:一对{}就是一个代码块
悬空else
这个代码会输出什么?
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
运行结果:
什么都没有?!
其实把这段代码写在VS里面是这样的:
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
所以esle是与离它最近的if匹配的
同时,我们也要注意代码风格的规范性,这样的话不仅美观,也便于我们理解
代码规范
1、变量的命名(有意义,规范)
char firstname[20] = 0; //普通命名
char first_name[20] = 0; //加下划线
char FirstName[20] = 0; //首字母大写
2、空格,空行,换行
int a = 10; //有空格
int a=10; //无空格
考虑下列代码的输出:
int test()
{int a = 1;if (a == 1)return 1;return 0;
}
int main()
{int r = test();printf("%d\n", r);return 0;
}
输出结果如下:
其实,test函数的意思就是,如果a=1,就返回1;如果a不等于1,就返回0
但是,该函数里并没有else,可能会误导阅读代码的人:无论a是否等于1,都要返回0
所以,我们应该把代码写得尽量规范:
int test()
{int a = 1;if (a == 1)return 1;elsereturn 0;
}
int main()
{int r = test();printf("%d\n", r);return 0;
}
让编译器指出错误:
如果你想要判断是否相等,可以写成这样:
int main()
{int num = 2;if (5 == num){printf("hehe\n");}return 0;
}
这样如果你不小心少写一个=,编译器会报错:
否则,编译器不会报错,编译器会觉得你在赋值,并没有语法错误
练习
判断一个数是否为奇数
//判断一个数是否为奇数
int main()
{int a = 0;scanf("%d", &a);if (a % 2){printf("YES\n");}else{printf("NO\n");}return 0;
}
测试1:
测试2:
输出1-100之间的奇数
代码1
//输出1-100之间的奇数
int main()
{int a = 1;while (a < 101){if (a % 2){printf("%d ", a);}a++;}return 0;
}
结果如下:
代码2:
//输出1-100之间的奇数
int main()
{int a = 1;while (a < 101){printf("%d ", a);a+=2;}return 0;
}
19-5-2 switch语句
当分支过多,if-else语句过于复杂,这个时候可以采用switch语句
语法结构:
switch(整型表达式)
{语句项;
}
注:表达式必须是整型
语句项:
case 整型常量表达式:语句;
注:表达式必须是整型,并且是常量,字符也是可以的,因为字符对应的ASCII码值是整型常量
代码举例:
int main()
{int day = 0;scanf("%d", &day);switch(day){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");}return 0;
}
运行结果:
为什么会出现这种情况呢?
原因:case只决定了入口,不决定出口
switch语句从哪里跳出去呢?
要用break
int main()
{int day = 0;scanf("%d", &day);switch(day){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;}return 0;
}
运行结果如下:
改变要求:
1、输入1-5,输出“weekday”
2、输入6-7,输出“weekend”
我们当然可以直接对上面的进行修改,也可以这样简化,实现多个case匹配同一个语句的效果:
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}
测试1:
测试2:
编程好习惯:
最后一个break加不加好像都可以,但是还是建议加上,万一以后还要延续呢?这是一个良好的编程习惯。
default
如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结果就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签:
default:
写在任何一个case标签可以出现的位置。
当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
所有case都不能匹配,就会走到default:
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;default:printf("输入错误!\n");break;}return 0;
}
运行结果:
练习
下列代码的输出是什么?
int main()
{int n = 1;int m = 2;switch (n){case 1:m++;case 2:n++;case 3:switch (n){case 1:n++;case 2:m++; n++;break;}case 4:m++;break;default:break;}printf("m=%d n=%d\n", m,n);return 0;
}
结果如下:
解释:
int main()
{int n = 1;int m = 2;switch (n) //n=1,跳到case1{case 1:m++; //m=3,没有break,继续向下走case 2:n++; //n=2case 3:switch (n) //n=2,跳到case2{case 1:n++;case 2:m++; n++; //m=4,n=3break; //只是在这个switch里结束了}case 4:m++; //m=5break;default:break;}printf("m=%d n=%d\n", m,n); //m=5 n=3return 0;
}