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");
else
printf("haha\n");
return 0;
}
运行结果:
什么都没有?!
其实把这段代码写在VS里面是这样的:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("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;
else
return 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=2
case 3:
switch (n) //n=2,跳到case2
{
case 1:n++;
case 2:m++; n++; //m=4,n=3
break; //只是在这个switch里结束了
}
case 4:
m++; //m=5
break;
default:
break;
}
printf("m=%d n=%d\n", m,n); //m=5 n=3
return 0;
}