C语言初阶
分支语句和循环语句
分支语句
if、switch
循环语句
while、for、do while
goto语句
1. 什么是语句?
c语句可分为以下五类:
表达式语句
函数调用语句
控制语句
符合语句
空语句
c语言是【结构化】的程序设计语言
顺序结构 选择结构 循环结构
先介绍控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式。
它们由特定的语句定义符组成,c语言有9种控制语句
可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句
2. 循环语句:do while语句、while语句、for语句
3. 转向语句:break语句、goto语句、continue语句。return语句
2. 分支语句(选择结构)
2.1 if语句
语法结构:
单分支
if(表达式)
语句;
int main()
{
if (3 == 5)
printf("xixi\n");//不打印
return 0;
}
if中表达式为真(非0)才执行
在 if 语句或者 else 语句后面,如果只有一条语句需要执行,那么{}可以省略。
int main()
{
int a = 10;
if (a == 3 )
printf("xixi\n");不打印
return 0;
}
如果把if(a == 3)改成if(a = 3)
则会打印,因为“ = ”为赋值,a = 3,为真。
为了减少出错可以这样写
3 == a,这个等价于,a == 3,而且如果这个时候漏写一个=,即3=a,会报错。
双分支
if (表达式)
语句1;
else
语句2;
int age = 10;
if (age < 18)
{
printf("未成年\n");
printf("不能打瓦\n")
}
//if后面跟多条语句时要加{}
else
printf("成年\n");
int age = 10;
if (age < 18)
printf("未成年");
else if (18 <= age < 28)
printf("可以玩cf");
这样是错的,age=10时候也会打印,可以玩cf。
因为(18 <= age < 28)中首先看18 <= age,age是10,为假的所以是0,变成0<28,整体为真。
可以这样写:
else if (age >= 18 && age < 28)
多分支
int age = 10;
scanf("%d", &age);
if (age < 18)
printf("未成年");
else if (age >= 18 && age < 28)
printf("可以玩cf");
else if (age >= 28 && age < 40)
printf("可以玩lol");
else if (age >= 40 && age < 60)
printf("可以玩王者");
else if (age >= 60 && age < 120)
printf("可以玩蹦极");
else
printf("老乌龟");
思考题:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("xixi"\n);
return 0;
}
最终不打印
因为else自动和最近的if匹配
练习:
1. 判断一个数是否为奇数
int main()
{
//判断一个属是否为奇数,先输入一个数
int a = 0;
scanf("%d", &a);
//判断
if (a%2 == 1)
{
printf("奇数\n");
}
else
printf("偶数\n");
return 0;
}
2. 输出1到100之间的奇数
int main()
{
//产生1到100的数
int i = 1;
while (i <= 100)
{
//判断是否为奇数
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
或者
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
2.2 switch语句
switch语句也是一种分支(选择)语句
常常用于多分支的情况
如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期天
int main()
{
int day = 0;
scanf("%d", &day);
if (1 == day)
printf("星期一\n");
if else(2 == day)
printf("星期二\n");
....
return o;
}
写成if...else if...else if的形式太复杂,就需要有不一样的语法形式
switch
switch(整型表达式)
{
语句项:
}
//语句项是一些case语句
如:
case 整型常量表达式://不能是非整型,也不能是变量,字符也是整型
语句;
在 C 语言里,case 关键字主要用于switch语句中,它是构成多分支选择结构的重要部分。
switch语句能够依据一个表达式的值,从多个选项里挑选出特定的代码块来执行。
而case就用于定义这些选项。
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");
.....
}
return o;
}
如果输入2,会输出234(称为穿透现象),因为没有break
遇到break才会跳出switch
完整形式:
switch (表达式)
{
case 常量表达式1:
// 当表达式的值等于常量表达式1时执行的代码
语句1;
break;
case 常量表达式2:
// 当表达式的值等于常量表达式2时执行的代码
语句2;
break;
// 可以有更多的 case 分支
...
default:
// 当表达式的值与所有 case 后的常量表达式都不匹配时执行的代码
语句n;
break;
}
switch 表达式:
这个表达式的值通常是整数类型(像 int、char 等)。
switch 会依据这个表达式的值来决定执行哪个 case 分支。
case 常量表达式:
跟在 case 后面的常量表达式,用于和 switch 表达式的值进行比较。
一旦相等,就会执行该 case 分支下的语句。这里的常量表达式必须是常量,不能是变量。
break 关键字:
它的作用是终止当前 switch 语句的执行,跳出 switch 结构。
要是没有 break,程序会继续执行下一个 case 分支的语句
直至遇到 break 或者 switch 语句结束,这就是所谓的“穿透”现象。
default 关键字:
这是可选的。当 switch 表达式的值和所有 case 后的常量表达式都不匹配时
就会执行 default 分支下的语句。
如:
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;
default:
printf("最多只有星期七,蠢货!\n");
break;
}
return 0;
}
穿透现象示例:
int main()
{
int num = 2;
switch (num)
{
case 1:
printf("数字是 1\n");
case 2:
printf("数字是 2\n");
case 3:
printf("数字是 3\n");
break;
default:
printf("数字不是 1、2、3\n");
break;
}
return 0;
}
在这个示例里,num 的值为 2,程序会执行 case 2 分支下的语句,输出“数字是 2”。
因为 case 2 分支中没有 break 语句,程序会接着执行 case 3 分支下的语句
输出 “数字是 3”,直到遇到 break 语句才会跳出 switch 结构。
这种现象就是“穿透”现象,在某些情况下可以巧妙利用,但使用时要谨慎,防止出现意外结果。
题目:
输入1-5,输出的是“weekday”
输入6-7,输出“weekend”
输入1到7以外的东西,输出“蠢货”
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;
}
多个case匹配同一个语句的情况
思考小问题:
int main()
{
int n = 1;
int m = 2;
switch (n)//n=1,m=2,执行case 1
{
case 1: m++;//n=1,m=3,由于没有break则继续执行case 2
case 2: n++;//n=2,m=3,继续执行case 3
case 3:
switch (n)//n=2,m=3,执行case 2
{//switch允许嵌套使用
case 1: n++;
case 2: m++; n++;//n=3,m=4,遇到break,跳出此小swutch
break;
}//整个大的switch还是没遇到break,继续执行case 4
case 4:
m++;//n=3,m=5
break;
defaulf:
break;
}
printf("m = %d,n = %d\n", m, n);
return 0;
}
分支语句结束,介绍了if语句和switch语句