Mike 发表于 2021-7-22 20:09:17

分支和循环(一)

C语言学习笔记(五)
现实生活中无非就三种结构

[*]顺序结构
[*]选择结构
[*]循环结构

分支语句:

[*]if else 语句
[*]switch 语句
循环语句:

[*]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循环

[*]case决定入口
[*]break决定出口
 
【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 子句的位置可以随意放,只不过不建议这么写



文档来源:51CTO技术博客https://blog.51cto.com/u_15304931/3169760
页: [1]
查看完整版本: 分支和循环(一)