分支语句和循环语句
C语言是一门结构化的程序设计语言
生活中的结构无非就3种
-
顺序结构
-
选择结构
-
循环结构
现在着重学习后两种
什么是语句?
在C语言中,由;
隔开的就是一个语句
int main()
{
int a = 0;//这是一条语句
;//这也是语句——空语句
return 0;
}
一、分支语句(选择结构)
if语句
if的语法结构:
if(表达式)
语句;
如果结果为真,则执行语句,如果为假,则什么都不执行。
在C语言中如何表示真假?
0表示假,非0表示真,如-1,不是零,表示为真。
if(表达式)
语句1;
else
语句2;
如果结果为真,则执行语句1,如果为假,则执行语句2。
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
如果表达式1成立,执行语句1,表达式1不成立再判断表达式2,表达式2成立就执行语句2,不成立则执行语句3,只能执行这三种的其中一种。
else if可以写多个
int age = 10;
if(age<18)
printf("未成年\n");
这是一个单支结构,只有一个分支
int age = 10;
if(age<18)
printf("未成年\n");
else
printf("成年\n");
if- else语句
int age = 10;
if(age<18)
printf("未成年\n");
else if(18<=age && age<28)
printf("青年\n");
else if(28<=age && age<50)
printf("壮年\n");
else//上述任何一种情况都不成立也就是年龄>=50执行这一行
printf("老年\n");
如果想写18-28属于青年的话,直接写else if(18<=age<28)
是不行的,代码在执行的时候会先执行前半段18<=age
,结果为假,这部分的结果变成0
,然后接着执行0<28
,结果为真,输出结果为青年
,而设定的age为10,这显然是个错误的结果。
想同时满足两个条件应该用&&
连接。
上述代码写成以下也是可以的,
int age = 10;
if(age<18)
printf("未成年\n");
else //在age>=18的情况下,再细分
{
if(18<=age && age<28)
printf("青年\n");
else if(28<=age && age<50)
printf("壮年\n");
else//上述任何一种情况都不成立也就是年龄>=50执行这一行
printf("老年\n");
}
注意
- if语句控制多条语句要用大括号括起来
int age = 10;
if(age<18)
{
printf("未成年\n");
printf("不能打游戏\n");
}
-
一对大括号
{ }
就是一个代码块 -
else会和距离最近未为匹配的if匹配
int main()
{
int a = 0;
int b = 2;
if(a==1)
if(b==2)
printf("111\n"):
else//虽然这里的缩进是和第一个if对齐的,但实际上是和第二个if成对。
printf("222\n");
return 0;//最终打印结果是空。
}
如何打印出222呢?加一个大括号即可:
int main()
{
int a = 0;
int b = 2;
if(a==1)
{
if(b==2)
printf("111\n"):
}//这里就变成了一个代码块,条件成立,执行这个代码块,条件不成立,执行else。
else
printf("222\n");
return 0;//最终打印结果是222。
}
- 使用if的时候要注意代码的可读性,适当的使用{}可以使代码的逻辑更加清楚。
if(condition)
{
return x;
}
return y;
if(condition)
{
return x;
}
else
{
return y;
}
这两段代码表达的意思完全一样:条件成立,返回x的值,条件不成立,返回y的值。但是第一段代码读起来的时候,要理解意思会困难许多。
- 注意=与==的区别
int num = 4;
if(num = 5)//一个=是赋值,==才是判断相等
{
printf("111\n");//这样写无论num是多少都会打印这一行。
}
为避免犯这种错误,可以把数字写在变量左边5==num
,如果写成了5=num
代码会报错,这样就能更容易注意到这个问题了。
打印1-100中所有的奇数
int main()
{
int i = 1;
while (i<101)
{
if(i%2==1)
printf("%d ",i);
i++;
}
return 0;
}
int main()
{
int i = 1;
while(i<=100)
{
printf("%d ",i);
i+=2;
}
return 0;
}
switch语句
常用于多分支的情况。
switch(整型表达式)
{
case 值:
语句;
break;
}
break是跳出循环,每个case后面都要加
示例:
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
}
return 0;
}
switch( )语句执行时先判断括号内的结果是几,结果是几就会从下面的case中选择一个合适的进去,执行完之后break跳出去,case决定入口,break决定出口。
注意
-
case后面加的是
:
-
switch( )括号内的必须是个整型,其他类型会报错。
-
case
后面必须是整型常量表达式,不可以是变量。 -
break
可以不用加。输入1-5时,输出工作日,6-7,输出工作日
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default://上面的情况全都没有,进入下面这个代码块,可写可不写。
printf("输入错误\n");
break;
}
return 0;
}
-
break
的实际效果是把语句列表划分为不同的部分 -
最好在最后一个case后面加上break 编程好习惯
-
case是决定代码进入位置的,进去后只要没遇到break就会继续往下运行。
小练习题:m,n的值是多少
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1://从这里进入开始一步一步执行下面的代码
m++;//m=3
case 2:
n++;//n=2
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2://这个switch从这里进入
m++;//m=4
n++;//n=3
break;//跳出case3的switch语句
}
case 4://继续执行case4
m++;//m=5
break;//跳出switch语句
default:
break;
}
printf("m = %d, n = %d\n", m, n);//结果是m=5,n=3
return 0;
}
二、循环语句
while循环
while的语法结构
while(表达式)
循环语句;
如果表达式为真,执行循环语句,执行完后再次判断,为真再次执行,如果有一次为假,停止循环.
打印1-10
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ",i);
i++;
}
return 0;
}
break
跳出循环,永久终止循环
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)//当i=5时会执行这一句
break;//也就是跳出循环
printf("%d ",i);
i++;
}
return 0;//最后的结果是1 2 3 4
}
continue
跳过这次循环的剩下内容直接跳到循环开头开始下一次循环
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)//i = 5,执行continue
continue;//剩下的都不执行,跳到循环开始的地方
printf("%d ",i);
i++;
}
return 0;//结果是1 2 3 4 然后程序没走完但是进入死循环
}
解释以下代码:
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch=getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
-
getchar用来接受用户输入的字符,存放在
ch
里, -
每次循环都会要求用户输入一个字符,然后判断字符是否为
EOF
,如果不是,那就输出刚刚输入的字符 -
EOF
是end of file
文件结束标志,它的值是-1,输入这个东西不是直接在键盘上打EOF
三个字母,要按住ctrl+z
才行
- 文件结束标志和字符串结束标志
\0
是类似的