C语言学习笔记(五)
现实生活中无非就三种结构
分支语句:
循环语句:
- while 循环语句
- for 循环语句
- do while 循环语句
什么是语句
由一个;(分号)隔开的叫语句
int a = 0;
return 0;
;
//这些都是语句(甚至只有一个分号也叫语句)
一、分支语句
【1】if分支语句
if分支语句有单分支语句、双分支语句、多分支语句
①单分支语句:
if(表达式)
语句;
int a = 10;
if(a < 11)
printf("哈哈\n");
//表达式为真打印“哈哈”,表达式为假不打印
②双分支语句:
if(表达式)
语句1;
else
语句2;
int a = 10;
if(a < 11)
printf("哈哈\n");
else
printf("呵呵\n");
//表达式为真执行语句1,打印哈哈;表达式为假执行语句2,打印呵呵
③多分支语句:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
int age = 10;
if(age < 18)
printf("未成年\n");
else if(age > 18 && age < 50)
printf("壮年\n");
else
printf("老年\n");
//表达式1为真执行语句1;表达式1为假,执行表达式2,表达式2为真打印语句2;表达式2为假执行语句3
【拓展①】 int age = 10;
if(18 < age < 50)
printf("壮年\n");
else
printf("未成年\n");
age明明小于18,结果却输出壮年,原因就出在 18 < age < 50 这里,这种写法是错误的,虽然在语法上没问题,18 < 10 不成立结果为假,值为 0,0 < 50 结果为真,表达式成立,打印壮年,这就是代码的执行过程,正确的写法应该是:age > 18 && age < 50
if语句还可以用嵌套式的写法,例如: int age = 49;
if(age < 18)
printf("未成年\n");
else
{
if(age > 18 && age < 50)
printf("壮年\n");
else
printf("老年\n");
}
【拓展②】
关于if语句使用 {} 的问题
如果条件为真(假),要执行多条语句则需要加 {} ,否则不需要 int a = 10;
if(a < 18)
printf("未成年\n");
//这里条件为真,只执行一条语句,所以可以不加 {}
int a = 10;
if(a < 18)
{
printf("未成年\n");
printf("不可以抽烟\n");
}
//这种情况就需要加 {}
【1.1】悬空else
这两个种情况打印的结果都是什么也没有,为什么会是这种结果,难道不是先执行第一条 if 语句,因为 a = 0;故不等于 1,条件为假,不执行第二条if语句,直接执行 else,打印 haha 吗?
当然不是这样的,正确的分析结果:我们要明白一个知识点,else 与离它最近的且为匹配的 if 进行匹配,由代码可知离 else 最近的就是第二条 if 语句了,且为匹配,所以第一条 if 语句条件如果为假,那就什么都不执行了,直到条件为真才执行第二条 if 语句。
结论:else 与离它最近的且为匹配的if进行匹配
其实造成第一种错误分析的原因是代码不规范。如何使 else 与第一条 if 语句匹配呢? int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
}
else
printf("haha\n");
运行结果:haha
【1.2】if 书写形式对比
代码一 if(condition){
return x;
}
return y;
代码二 if(condition)
{
return x;
}
else
{
return y;
}
- 分析代码一:如果条件成立,返回 x ,return y 不被执行,只有条件为假的时候才会返回 y ,很多人会认为无论条件是否成立,都会返回 y ,这是错误的,注意是 return 而不是其它语句,执行 return 就返回了,不再执行其它语句了。
- 分析代码二:如果条件为真,返回 x ,条件为假,返回 y 。
结论:代码一和代码二就提现了代码书写不规范所带来的问题,会影响读者理解代码的意思
【拓展①】
代码一 int a = 10;
if(a = 20)
{
printf("haha\n");
}
运行结果:哈哈 代码二int a = 10;
if(a == 20)
{
printf("haha\n");
}
运行结果:
= 是赋值,在代码一中 a = 20,是改变了 a 的值,不管值为多少,条件都是成立的,haha一定会被打印,而代码二中的 == 是判断相等,10 != 20,条件为假,haha不会被打印;这种错误并非语法上的错误,编译器是不会报错了,所以如果是在写显目,不小心写成这种情况,是很难发现的。这里提供一种方法来解决这个问题。 int a = 10;
if(20 == a)
{
printf("haha\n");
}
//如果写成 if(20 = a) 那编译器就会报错了,这就很好的避免了上述问题
【2、】switch分支语句
//语法
switch(整型表达式)
{
语句项:
}
//语句项
case 整型常量表达式:
语句;
- 整型表达式:必须是整型
- 整型常量表达式:产生的结果必须是整型
int a;
switch(a)
{
case 1+0 :
printf("haha\n");
}
//这是都是正确的
int a = 0;
int n = 1;
scanf("%d",&a);
switch(a)
{
case n :
printf("星期一");
break;
}
//这种写法是错误的,语法要求 n 所在的那个位置必须为整型且为常量表达式,但是 n 是变量,所以会报错
分析代码: int a = 0;
scanf("%d",&a);
switch(a)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
}
分析:根据 a 的值,找到对应的地方,比如输入 2 ,a 的值为 2 ,就执行 case 2:的代码,打印星期二,接着执行 break;语句跳出循环。break是跳出switch循环
【default子句】
如果输入的结果在 case 中找不到对应的入口,程序就什么也不输出,我们可以加上 default 来解决这个问题,如果输入的结果在 case 中找不到对应的入口,那就执行 default 子句,打印错误提示信息 int a = 0;
scanf("%d",&a);
switch(a)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
default:
printf("输入错误");
break;
}
运行结果:
输入:4
输入错误
输入:1
星期一
【拓展①】
default 子句只能放在 switch 语句的结尾吗?
当然不是的,在C语言中没有明确规定 default 子句的位置,所以 default 子句的位置可以随意放,只不过不建议这么写
|