评论

收藏

[C++] 分支和循环(一)

编程语言 编程语言 发布于:2021-07-22 20:09 | 阅读数:371 | 评论:0

C语言学习笔记(五)

现实生活中无非就三种结构


  • 顺序结构
  • 选择结构
  • 循环结构
DSC0000.jpg

分支语句:


  • if else 语句
  • switch 语句
循环语句:


  • while 循环语句
  • for 循环语句
  • do while 循环语句
什么是语句

由一个;(分号)隔开的叫语句

int a = 0;
return 0;
;
//这些都是语句(甚至只有一个分号也叫语句)
 

一、分支语句

【1】if分支语句

          if分支语句有单分支语句、双分支语句、多分支语句

①单分支语句:

     if(表达式)

          语句;

DSC0001.jpg
int a = 10;
if(a < 11)
  printf("哈哈\n");
//表达式为真打印“哈哈”,表达式为假不打印
②双分支语句:

     if(表达式)

          语句1;

     else

          语句2;

DSC0002.jpg
int a = 10;
if(a < 11)
  printf("哈哈\n");
else
  printf("呵呵\n");
//表达式为真执行语句1,打印哈哈;表达式为假执行语句2,打印呵呵
③多分支语句:

     if(表达式1)

          语句1;

     else if(表达式2)

          语句2;

     else

          语句3;

DSC0003.jpg
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

DSC0004.jpg DSC0005.jpg

这两个种情况打印的结果都是什么也没有,为什么会是这种结果,难道不是先执行第一条 if 语句,因为 a = 0;故不等于 1,条件为假,不执行第二条if语句,直接执行 else,打印 haha 吗?

DSC0006.jpg

当然不是这样的,正确的分析结果:我们要明白一个知识点,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分支语句

DSC0007.jpg
//语法
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 语句的结尾吗?

DSC0008.jpg

当然不是的,在C语言中没有明确规定 default 子句的位置,所以 default 子句的位置可以随意放,只不过不建议这么写

DSC0009.jpg DSC00010.jpg



关注下面的标签,发现更多相似文章