超全&超细的C语言基础知识点之《分支和循环》入门包懂

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 超全&超细的C语言基础知识点之《分支和循环》入门包懂,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

分支&循环超全超细知识点总结!

大家好,这里是瑶瑶子,一个努力学习计算机知识的大学生,在这里分享自己的学习内容,希望分享的知识和内容能够对你们有帮助。可能存在理解不深刻、全面,说法不准确的地方,希望给出宝贵的建议,让我们共同进步和成长!
知识体系导图
图片:在这里插入图片描述

C语言结构(三种)

首先我们要知道,C语言是一门结构化的程序设计语言,C语言有三种结构,分别是:顺序结构选择结构循环结构

·顺序结构:程序从头到尾按照顺序依次进行,没有选择性(某部分代码执行某部分代码不执行),也不会重复执行某部分代码。

#include <stdio.h>
int main()
{  printf("hello word\n");
   printf("happy new year\n");

return 0;
}


·选择结构:是根据条件,判断是否能否执行程序。所以说是具有选择性的。选择结构对应的语句是选择语句,包括if语句switch-case语句
举个例子:

#include<stdio.h>
int main()
{  int i=0;
   printf("1+1=\n");
   scanf(%d",i);
   if(i=2)
   {
     printf("恭喜你回答正确\n");
   }
   else
   {
     printf("很遗憾,你回答错误\n")
   }
 return 0;
}

我们可以看到当i等于2时会执行if后面的语句,i不等于2时执行else后面的语句 。
当然这个if语句后面会细讲

·循环结构首先循环,就是让代码循环往复做一件事。循环结构相对应是循环语句,包括while循环for循环do while循环
举个例子:

#include<stdio.h>

int main()
{
  int i=1;
  while(i<=3)
  {
    printf("我真棒\n");
    i++}
  
  return 0;
}

这个代码的执行结果是三个一样的“我真棒”
其实可以看出来while和if都是先判断再执行,但是while要重复执行。也可以看得到,循环会帮助我们完成需要重复做的事情。虽然这里是三次,如果是五十次呢?不用循环岂不是要输入五十次”我真棒”?
所以循环的存在很有意义。

分支语句

1、if语句

·语法结构
一,

//单分支
if(表达式)
{
  语句1}

解释:括号内的表达式可以是关系表达式(指运算符为<、>、<=、>=、==、!=的表达式)、逻辑表达式(指运算符为||、&&、非1的表达式)、数值表达式(运算符为赋值号=)。

语句1:就是当括号内表达式的结果为非0时索要执行的语句(0为假,非0为真)。

当然这里的语句也可以是多条。

语法结构 二、

//多分支语句(级联if语句)
if(表达式1{
语句1}
if else(表达式2{
语句2if else(表达式3{
语句3}
......
else(表达式n)
{
语句n:
}


这里的一个{ }就是一个代码块,里面其实也不一定就是单单的一个语句,根据需求也可以包含多个语句。

嵌套的if
简单来说,就是if后面的语句也是一个或多个if语句,成一种嵌套形式。
举个例子:求a、b、c三个数哪个数最大

//嵌套的if
#include<stdio.h>

int main()
{
  int a=3
  int b=2;
  int c=6;

  if(a>b)
  {
    if(c>a)
    {
      printf("c最大\n");
    }
    else
    {
      printf("a最大\n"):
    }
  }
  else (b>a)
  {
    if(c>b)
    {
      printf("c最大\n");
    }
    else
    {
      printf("b最大\n");
  }

return 0;  
}

注意:1,一条时可以省去大括号,多条时必须加上大括号。
2,if语句括号的后面是没有分号的。
3,if大括号内索要执行的语句后面是要有分号的。
4,else 总是和最近的那个没有匹配的if进行匹配,简称为就近就近原则
我们来看一个例子:

//悬空else问题
#include<stdio.h>
 int main()
 {
   int a=1;
   int b=2;
   
   if (b==3)
     if(a==1)
     printf("honesty");
   else
   printf("calculation");

return 0;
}

你觉得这个代码的运行结果是?

如果你觉得是calculation
那么恭喜你,想错了
其实我第一次看这个代码也觉得很奇怪,怎么有两个if而且我们初学者的视角,会觉得if的条件没满足,那就跳到else,执行else后面的结果吧,而且第一个if是和else对其的欸。但计算机不会这么认为,它会把else和离它最近的那个没有匹配的if进行匹配,当与它匹配的那个if条件不满足时,才会执行else后面的语句。

所以这个代码的执行结果是:什么也不执行。

我们分析一下,b==3不满足,也就是这个条件为假,而且又没有和这个if匹配的else,那么编译器就会自动跳转到return 0;也就是什么结果都不会输出。

但是如果你就是想让这个代码的第一个if和else匹配,或者是你不想引起歧义,根据上面那个代码,我们的原意是想表示,如果b == 3,a == 1,输出”honesty”,否则输出“calculation”,那么我们应该在if后面加一对花括号{ }
也就是下面这样

if(b==3)
{
   if(a==1)
  {
  printf("honesty"):
  }
}
else
{
printf("calculation");
}

由上可知,加上花括号的好处有很多,不会引起歧义,让读者易读易理解代码。
所以作为一个良好的编程习惯,我们把if或者else后面不管几条语句,我们都加上花括号。

5,(重要的事情说三遍!!!)
关系表达式中的“= =”不要误写成“=” !!!
关系表达式中的“= =”不要误写成“=” !!!
关系表达式中的“= =”不要误写成“=” !!!

我们来举个例子

int i=0;
scanf("%d",i);
if(i==3)
{
  printf("星期三\n");
}

只有当我们输入3,时输出结果才是”星期三”,否则什么也不输出。

int i=0;
scanf("%d",i):
if(i=3)
{
printf("星期三\n");
}

当我们去运行这个代码时会发现,无论我们输入的是什么数字,输出结果总是”星期三“,这和我们理想结果有偏差。

解释:
首先我们要明白的是,什么时候才能执行if后面的语句。前面也提到了:当表达式结果为非0时。

” ==“是关系运算符,它表示的是”相等关系“,只有该符号前后的数据相等时,该表达式的结果就为非0,不相等时为假。只有表达式结果为非0时,才会执行if后语句。这也就是为什么只有输入3时才会打印”星期三“。

”=“是赋值号,表示把运算符后面的值赋值给前面。如:a=b就是把b的值赋给a,表示的不是关系,而是赋值这一动作。赋值也是运算的过程,也有结果,赋值表达式的结果就是赋值符号右边的值!!!所以(i=3)这个表达式表示的就是把3赋值给i,这个表达式的结果为3,非0,执行if后面的语句,所以无论输入什么,这个表达式结果都为非0,都打印”星期三“。

2、switch-case语句

语法结构

 switch(整形表达式)//括号里面表达式的结果必须为整形
//switch是表示判断
 {
  case 1://case后面不一定是数字,但也一定是整形常量表达式
  语句1;
  case 2://case相当于一个如果,根据switch判断从哪个case进入
  语句2...
  //花括号里面的为语句项,基本结构如上
 }

注意:case后面的必须是整形常量表达式,注意是常量,不是变量!

还是先整个例子:根据我们所输入的数字,输出对应的星期几。
如果用if语句如何表示?

#include<stdio.h>

int main()
{
  int i=0;//初始化
  scanf("%d",&i);

  if(i==1)
  {
    printf("星期一\n");   
  }
  else if(i==2)
  {
    printf("星期二\n");
  }
  else if(i==3)
  {
    printf("星期三\n");
  }
  else if(i==4)
  {
    printf("星期四\n");
  }
  else if(i==5)
  {
    printf("星期五\n");
  }
  else if(i==6)
  {
    printf("星期六\n");
  }
  else if(i==7)
  {
    printf("星期天\n");
  }
  else
  
  return 0;
}

输出结果如下
在这里插入图片描述

在这里插入图片描述

用switch-case语句表示?

#include<stdio.h>

int main()
{
  int i=0;
  scanf("%d",i);

  switch(i)
  {
    case 1:
        printf("Monday\n");
    case 2:
        printf("Tuesday\n");
    case 3:
        printf("Wednesday\n");
    case 4:
        printf("Thursday\n");
    case 5:
        printf("Friday\n");
    case 6:
        printf("Saturday\n");
    case 7:
        printf("Sunday\n");
  }
 return 0;
}

感觉的确比if语句简洁哈。但是这个代码正确吗?或者准确吗?
我们看一下运行结果:
在这里插入图片描述
在这里插入图片描述
输入7还是正常,为什么输入3会输出5个结果呢,不应该是Wednesday这一个结果吗?
这就要引入到一个知识点:break与continue 用法(continue会在后文循环部分讲到)
break:
表示“停止和终止”

上面那个代码输出结果有问题,是因为case的确是入口,从case3进入,代码向下执行,可出口呢?也就是说代码只有把case3之后的代码都执行完,才会跳出这个体系,这也就是为什么Wednesday后面一直到Sunday都被打印出来。我们理想的输出结果就是,输入3,输出Wednesday。也就是说我们要让这个代码打印完Wednesday之后,就跳出这个体系(或者说有个出口),不再继续往下打印。这里我们就需要用“break”完成这个目的,让这个代码在该结束的地方结束并跳出这个体系。

break相当于一个终止标志,当代码有机会遇到break时它就会跳出这个体系(这里就是指switch-case)。综上,case决定switch语句入口,break决定出口
所以我们看一下改进后的代码:
(注意:break后面也是要加分号的)

#include<stdio.h>

int main()
{
  int i=0;
  scanf("%d",i);

  switch(i)
  {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    case 4:
        printf("Thursday\n");
        break;
    case 5:
        printf("Friday\n");
        break;
    case 6:
        printf("Saturday\n");
        break;
    case 7:
        printf("Sunday\n");
        break;
  }
 return 0;
}

输出结果如下,看,Perfect!
在这里插入图片描述
反思:1,每一个case必须要对应一个case吗?
·其实不然,还是根据具体需求,在合适的位置或者你想要停下来的位置加入break即可。
2,最后一个case是不是不用加break也行?
·就编译结果来说最后一个case其实要不要break没什么影响的。
但是为了下次修改代码(如我们需要加一个case,这个时候必须要把之前的最后一个case加一个break)比较方便不容易出错,而且作为一个好的编程习惯,我们还是在最后一个case也加上一个与之匹配的break.
3,如果我们输入的那个整形,并没有相应的case与之对应?
·这就需要用到default了,英文是“默认”的意思,其实就是一个默认的入口。当输入整形没有与之对应的case时,那就走default这个入口。
举个例子:

//将百分制成绩转换为等级制:
#include<stdio.h>

int main()
{
   int grade=0;
   printf("请输入成绩:>\n");
   scanf("d",&grade);
   int grade/=10;
   
   switch(grade)
   {
      case 10:
      case 9://这里也印证了不是每一个case都要匹配break
      printf("A\n");
      break;
      case 8:
      printf("B\n");
      break;
      case 7:
      printf("C\n");
      break;
      case 6:
      printf("D\n");
      break
      default://默认入口
      printf("E\n");
      break;
  }
   
   
return 0;
}

循环语句

1、while循环

语法结构

while(表达式)
   {
    循环语句;//我们把这个大括号包括里面的内容称作“循环体”
   }

注意:循环体内必须有改变条件的机会,否则就是死循环或者无限循环(如果需要的就是死循环,当俺没说(✿◕‿◕✿))
执行流程

在这里插入图片描述
break用法
当循环体内有机会执行到break时,那么就会跳出这个循环体,结束循环,继续按照程序向下执行下面的代码。
continue用法
当循环内部有机会执行到continue时,那么continue后面的代码(循环体内的)不再执行,程序认为此次循环结束,重新来到while的判断部分开启下一次循环。

我们还是用例子说话:

#include<stdio.h>

int main()
{
  int i=1;
  
  while(i<=10)//判断进入循环体条件
  {
     printf("%d\n",i);
     i++;
  }
return 0;
}

执行结果:
在这里插入图片描述
我们看一下加入break会发生什么:

#include<stdio.h>

int main()
{
    int i = 1;

    while (i <=10)
    {
        printf("%d\n", i);
        if (i == 3)
        {
            break;
        }
        i++;
    }
    return 0;
}

执行结果如下:
在这里插入图片描述
解释:当执行三次循环之后i==3,这个时候进入if语句,遇到break,跳出循环体不再i++也不再进入循环,所以执行结果为1 2 3.
再看一下把break换成continue会怎样:

#include<stdio.h>

int main()
{
    int i = 1;

    while (i <=10)
    {
        printf("%d\n", i);
        if (i == 3)
        {
            continue;
        }
        i++;
    }
    return 0;
}

执行结果如下:1 2 3 3 3 3_的循环
在这里插入图片描述
解释:当三次循环后i==3,执行if 语句,遇到continue,那么不再执行continue后面的代码(循环体内的),这里也就是i++,结束本次循环,再开启下一次循环,因为 i == 3 < 10,所以进入循环体,又遇到continue…如此循环往复,所以输出结果为1 2 3 3_的循环。

2、for循环:

语法结构:

for(表达式1;表达式2;表达式3{
循环语句;
}

表达式1:初始化部分,即初始化循环变量,确定循环变量从多少开始(注意:不是创建循环变量)。
表达式2:条件判断部分,判断循环变量何时终止。
表达式3:调整部分,用于调整循环变量。
执行流程
在这里插入图片描述

·与while循环比较:
表达式1相当于while循环外的初始化部分,表达式2相当于while后面的表达式1 都是条件判断部分,表达式三相当于while花括号里面的条件调整部分。
由上,我们可以看到,for语句比while语句更直观也更便于调整和更正。

区别举例:

  • while循环:
#include<stdio.h>

int main()
{
    int i = 1;

    while (i <=10)
    {
        printf("%d\n", i);
        if (i == 3)
        {
            continue;
        }
        i++;
    }
    return 0;
}

这个代码上面讲过,执行结果为 1 2 3 3 3…3 3_,这个死循环的结果

  • for循环
#include<stdio.h>

int main()
{
    int i = 0;

    for(i=1;i<=10;i++)
    {
        printf("%d\n", i);
        if (i == 3)
        {
            continue;
        }
    }
    return 0;
}

这个代码的执行结果为什么不一样呢?
在这里插入图片描述
解释:其实根本原因是因为while循环和for循环的执行流程不同。

  • while循环:continue之后的代码i++没有执行
  • for循环:continue后面没有其他代码,expr3(i++)还是照样执行,所以i==3后,continue结束此次循环,但是注意还是先要来到expr3加1此时i ==4,再继续循环来到expr2判断,再又一次进入循环体如此进行下去,得到的不是死循环,而是1 2 3 4 5 6 7 8 9 10

注意:

  • 不要在for循环体内修改循环变量,防止循环失去控制(变成死循环or无限循环)
    举个例子:
#include<stdio.h>

int main()
{
    int i = 0;

    for(i=1;i<=10;i++)
    {
       
        if (i = 5)//注意:这里是赋值符号“=”,不是关系等于符号“==” 意思把5赋值给i
        {
            printf("%d\n", i);
        }
    }
    return 0;
}

执行结果为:5的循环
在这里插入图片描述
解释:因为第一次进入循环或者说每次循环,i都被修改为了5<10(虽然i++了,但是再进入后又被修改为了5)如此循环往复,所以输出结果为5的循环。

  • 建议把循环控制变量(expr2) 采用“前闭后开区间”写法。
#include<stdio.h>

int main()
{
    int i = 0;

    for(i=0;i<10;i++)
    {
            printf("%d\n", i);
    }
    return 0;
}

i=0;i<10的写法优于i=1;i<9
因为前一种写法10,有一定的意义:
1,10次循环
2,10次打印
3,10个元素

for循环的一些变种

  • 省略:
int main()
{
  for(;;)
  {
     printf("I am chinese\n");
  }
}

1,for循环的初始化,判断,调整这三个部分都是可以省略的。但是注意,虽然判断的部分被省略了,但其实暗含判断条件为恒为正。
2,如果不是很熟练,建议不要随便省略。
举个例子:(不省略)

#include<stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    
    for(i=0;i<10;i++)
    {
        for (j = 0; j < 10; j++)
        {
            printf("Good morning\n");
        }
    }
    return 0;
}

执行结果如下:100个Good morning
在这里插入图片描述
(省略)

#include<stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    for(;i<10;i++)
    {
        for (;j < 10; j++)
        {
            printf("Good morning\n");
        }
    }
    return 0;
}

输出结果:10个Good morning
在这里插入图片描述
为什么这里不是100个呢,不是只是把 i=0和j=0省略了吗,结果应该也是100个Good morning才对呀。
这就是不熟练运用省略造成的后果!
解释:首先i=0进入第二个循环,第二个循环进行了十次之后出循环体再进入第一个循环,i=1,准备进入第二个循环,注意,此时j=10,也就是说根本进不去第二个for循环!!!因为进入第二个循环前j还是等于0,不像没有省略的那个版本,在再次进入j那个循环体时没有expr1把j重新初始化为0!这就是问题所在。

  • 两个循环变量(比较少见)
//变种2
#include<stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    for(i=0,j=0;i<3&&j<7;i++,j++)//&&表示“并且”的意思
    {
        printf("believe yourself\n");
    }
    return 0;
}

输出结果如下:3个believe yourself
在这里插入图片描述

3、do while循环

语法结构:

//do while循环结构
do
   {
    循环体语句;
   }
while(表达式)//循环条件
   

至少执行一次,使用场景有限,所以很少使用

执行流程:(先执行后判断)
在这里插入图片描述
以上就是关于分支和循环基础知识的全部啦!希望所讲的内容对你有帮助,思维导图和流程图都是自己制作的,希望能帮助你们记忆和理解。博主本人正在读大一,也是站在初学者的角度去努力理解并且尝试讲解,关于C语言分支和循环的讲解可能有不太准确的地方,但写博客的目的不就是记录学习分享学习内容和知识吗!希望各位同学能给出宝贵的意见,我会很高兴去听到他人的建议和理解,让我们共同进步!(❤ ω ❤)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142484.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!