我前面发表过的《初始c语言》系列文章是对c语言有大概的认识,现在进入了一个全新的阶段,在这个阶段,将对C语言有更深层次的认识,当然,因为C语言编程是一门实践性的学科,所以一定要多练,在文章中,我都会通过举例的形式,去加深对知识点的理解。
本文大纲
分支语句
- if
- switch
以及对应的一些题目解析
1. 什么是语句
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
本文主要介绍的是控制语句
- 条件判断语句也叫分支语句:if语句、switch语句;
- .循环执行语句也叫循环语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
做分支也就是在做选择,《初始c语言》中简单介绍过选择结构,就是将生活中的选择问题转化为代码的表达
(分支语句)选择结构中有:if语句、switch语句下面介绍以下它们的用法
2.1 if 语句
2.1.1 简单应用(单分支)
语法结构可以分为:
if (表达式)
语句;
这种是就基本的一种,表示的意思是:如果表达式为真(c语言中规定0为假,非0为真)就会执行语句,一般来说很少会单独用 if,但也举个简单的例子:
#include <stdio.h>
int main()
{
int age = 10;
if(age>18)
{
printf("成年\n");
}
if (age == 10)
{
printf("未成年\n");
}
return 0;
}
if (表达式)
语句1;
else
语句2;
如果表达式为真,语句1就要被执行
如果表达式为假,语句2就要被执行(就是如果……否则的意思)
这是比较常用的一种类型,下面举个例子:
#include <stdio.h>
int main()
{
int age = 10;
if (age > 18)
{
printf("成年\n");
}
else
{
printf("未成年\n");
}
return 0;
}
2.1.2 代码风格的重要性
特别注意
If 和else语句只跟一条语句就不用加大括号{ },因为不加大括号,if或者else都只能识别一条语句,跟多条语句就一定要加大括号,建议:无论一条或者是多条语句都加上大括号{ },下面就举个例子来说明一下代码规范的重要性 :
先猜一下下面的代码的输出是什么?
说明:else匹配规则:else是和它离得最近的if匹配的,就是把红框看作一组(不会因为和谁对齐而看成与它是一组),所以不会打印出任何东西
所以应该如何改正呢?下面给出改正后的代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("xixi\n");
return 0;
}
if的书写形式的对比,再来看一下,下面这个例子:想一下输出是多少
#include <stdio.h>
int test()
{
int a = 4;
if (a == 4)
return 1;
return 0;
}
int main()
{
int r = test();
printf("%d\n",r);
return 0;
}
对比于上面的代码,下面给出另一种书写:对比一下那种更有阅读性呢?
#include <stdio.h>
int test()
{
int a = 4;
if (a == 3)
return 1;
else
return 0;
}
int main()
{
int r = test();
printf("%d\n", r);
return 0;
}
再给个例子(这个凭个人习惯):
#include <stdio.h>
//if的书写形式的对比例二
int main()
{
int num = 3;
if (5 == num)//相当于if(num ==5),这个漏一个等号会报错,将变量赋值给常量是错误的
printf("haha\n");
return 0;
}
所以代码风格是很重要的,想要加强代码风格可以去看一下《高质量C++/C编程指南(李锐)》
2.1.3 多分支结构
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;//注意:分支结束的时候一定要用else结尾
以上语句同理,先判断表达式1是否为真,如果为真,就执行语句1,如果表达式1为假,就再判断表达式2是否真,如果为真,就执行语句2,如果所有 if 和else if都中的判断表达式都为假,就执行else中的语句3.
下面举个例子:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int age = 10;
scanf("%d",&age);
if (age < 18)
{
printf("青少年\n");
}
else if (age >= 18 && age < 28)
{
printf("青年\n");
}
else if(age >= 28 && age < 40)
{
printf("中年\n");
}
else if (age >= 40 && age < 60)
{
printf("壮年\n");
}
else if (age >= 60 && age < 100)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
2.1.3 练习
下面举一些例子,让大家对if 语句更加深刻。
练习1、写一段程序,输入一个整数,判断它是否为奇数
答案:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a;
printf("输入一个整数:");
scanf("%d",&a);
if (a % 2)//或者if(a % 2 == 1)
{
printf("这个数是奇数");
}
else
{
printf("这个数是偶数");
}
return 0;
}
练习2、输出1-100之间的奇数
答案:
#include <stdio.h> int main() { int a = 1; while (a < 100) { if (a % 2)//或者if(a % 2 == 1) { printf("%d ", a); } a++; } return 0; }
2.2 switch语句
switch也是一种分支结构,常用于多分支,虽然if else也可以写多分支,但过于复杂
比如:要求我们按照输入,来选择输出
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
如果用 if else 语句实现:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
if (1 == day)
printf("星期一\n");
if (2 == day)
printf("星期二\n");
if (3 == day)
printf("星期三\n");
if (4 == day)
printf("星期四\n");
if (5 == day)
printf("星期五\n");
if (6 == day)
printf("星期六\n");
if (7 == day)
printf("星期日\n");
else
printf("请输入正确的数字");
return 0;
}
if 语句的形式可能会太复杂,那我们就有了不一样的语法形式
这就是switch语句
switch(整型表达式)
{
case 整型常量表达式
语句;
}
2.2.1 在switch语句中的break
在switch语句中,我们没办法直接实现分支,要搭配break使用才能实现真正的分支
比如:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)//注意switch中的数据类型必须要整型
{
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;
}
如果在case下不加break,就会按顺序的执行case,直到遇到break或者程序结束。
比如:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//在比如只需要判断工作日或者是周末
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//注意switch中的数据类型必须要整型
{
case 1://可以不加break,不跳出,继续循环下面的语句
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
// default:
// printf("选择错误\n");
// break;
}
return 0;
}
这个例子就会发现,输入1-5的时候,就会按顺序执行到case 5 ,遇到break后退出,如果觉得不明显可以用调试(vs2019按F10,就能看到程序运行的步骤)
正式break的这个特性,使我们代码实现把语句列表划分为不同的分支部分,运用起来更加灵活。
2.2.2 default 子句
用上面的例子加入default 改进后:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//在比如只需要判断工作日或者是周末
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//注意switch中的数据类型必须要整型
{
case 1://可以不加break,不跳出,继续循环下面的语句
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
default:
printf("选择错误\n");
break;
}
return 0;
}
说明:上面的程序,输入1-7以外的值时就会输出选择错误
2.2.3 练习
为了巩固switch,下面一个题目,非常经典
阅读以下代码,写出输出。
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{
//switch允许嵌套使用
case 1:n++;
case 2:m++; n++;
break;//只会跳出当前的switch语句
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n",m,n);
return 0;
}
答案为:m = 5,n = 3
下一篇将介绍循环语句的相关知识