C语言分支与循环语句全面详解

今天介绍分支与循环语句,希望大家看过会轻松玩转分支与循环语句!

1.C语言中的控制语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

人生中常会面临选择。比如现在你是一位大学生,一位美女选择了你,而你可以选择和她在一起,也可以选择努力学习,为自己的将来做准备。那么你会选择哪个呢?果真很难选择
C语言分支与循环语句全面详解_第1张图片

2.1 if语句

(1)if语句的语法结构
每个if(表达式)语句里放的都是表达式,如果表达式为真,则执行下边的语句,如果不是真,则判断下一个分支语句。

C语言里:0表示假,非0表示真
注意:
if语句一个分支只能出现一次,且在最前放。(一个分支的开始)
else在if语句中只能出现一次而且只能出现在if语句的最后。
else语句可以出现多次,且总是在else语句的前面。(一个分支的结束,因为else已经包含了除前面if,else if限定的条件之外的所有条件。因此这个分支结束。)

C语言分支与循环语句全面详解_第2张图片
用代码给大家实现一下:

#include
int main()
{
    int choose = 0;
    printf("你选则美女(1)还是好好学习(0)\n");
    scanf("%d",&choose);
    if(1 == choose)
    {
         printf("你的未来未知\n");
    }
    else if(0 == choose)
    {
        printf("你的未来光明\n");
    }

    return 0;

}

这里剩下的就看大家的选择了。

(2)悬空else问题
大家认为这个代码的结果是什么呢?可以思考一下。

#include 
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

其实这个代码的结果是什么也不打印!为什么呢?
因为这里是由代码书写不规范给我们的读写判断带来了一些误导。
大多数人会认为这个else是与if(a == 1)组队的。其实不是,这个else是与离它最近的if进行匹配的,也就是if(b== 2)。因此一个if判断为假,所以程序就不进入分支,因此直接跳转到return0所以什么也不打印。

因此这既是悬空else,这种else只会与离它最近的if进行匹配。

那么如何避免呢?
就是规范书写:

#include 
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        {
            printf("hehe\n");
        }
        else
        {
            printf("haha\n");
        }
    }
    return 0;
}
//这样是不是一目了然多了,因此书写代码时尽量把分支语句的{}给带上,这样会使自己的代码逻辑清晰。


int main()
{
    int i = 0;
    scanf("%d",&i);
    if(0 == i)//这里写判断时把变量写在右边比较好,可以避免自己把判断相等写成 = 造成结果错误。
    {
        printf("haha\n");
    }
    return 0;
}

**(3)逻辑分析** 我给出两个代码,大家分析一下有什么区别
//代码1
int main()
{
    int i = 0;
    scanf("%d",&i);
    if(i>10)
    {
        printf("你好\n");
    }
    if(i<10)
    {
        printf("你好美\n");
    }
    if(10 == i)
    {
        printf("你好聪明\n");
    }
    
    return 0;
}

//代码2
int main()
{
    int i = 0;
    scanf("%d",&i);
    if(i>10)
    {
         printf("你好\n");
    }
    else if(i<10)
    {
         printf("你好美\n");
    }
    else(10 == i)
    {
        printf("你好聪明\n");
    }
    
    return 0;
}

这里代码1和2的区别看出来了吗?
区别就是:

代码1里无论i值你输入的是多少,三个if语句均会进行判断。
而代码2当你输入的i值大于10,进入第一个if判断语句后,后边的分支语句就不再进行判断。

2.2 switch语句

(1)switch语句的语法形式!C语言分支与循环语句全面详解_第3张图片
给大家写个代码了解一下:

#include 
int main()
{
    int day = 0;
    switch(day)
   {
        case 1printf("星期一\n");
        case 2:
            printf("星期二\n");

        case 3:
            printf("星期三\n");

        case 4:
            printf("星期四\n");
  
        case 5:
            printf("星期五\n");
  
        case 6:
            printf("星期六\n");

        case 7:
            printf("星期天\n");    

   }
    return 0;
}

这就是switch语句典型的用法,但是这种用法有明显的缺陷,就是无法及时停止。什么意思呢?就是当你输入1的时候,他会把后面所有的结果全部打印

C语言分支与循环语句全面详解_第4张图片

所以为了制止这样的情况发生,想让仅仅输出自己输入符合case情况的语句,switch语句经常与break结合使用,就会达到预期的结果。

#include 
int main()
{
    int day = 0;
    switch(day)
   {
        case 1printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}

这样的话输入1,此时就仅仅只会输出“星期一”。

break语句 的实际效果是把语句列表划分为不同的分支部分。因此在case后加上break是一个良好的编程习惯。

那么:

  1. 输入1-5,输出的是“weekday”;
  2. 输入6-7,输出“weekend”
    这个该如何实现呢?
#include 
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

上面咱们输入的数值因该是1-7,如果咱们输入的数据不在1-7的范围内该如何是好呢?


这时default就该上场表演了。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

因此上述代码改为这个更为合适:

#include 
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
        default:
            printf("输入错误\n");
            break;
   }
    return 0;
}

这里就完美了。

因此在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

3.循环语句

循环语句就是重复做一件事,达到一定程度后才会结束循环。
C语言分支与循环语句全面详解_第5张图片

3.1 while语句

循环语句的一员,下面为大家介绍一下:
while语句的语法结构:
C语言分支与循环语句全面详解_第6张图片

下面来实现一个简单的代码:
打印1-10的数字

#include
int  main()
{
    int i = 1;
    while(i <= 10)
    {
        printf("%d ",i);
        i++;
        
    }

    return 0;
}

相信大家已经基本了解了,接下来讲解一些while语句中的break和continue。
break介绍

int main()
{
    int i = 1;
    while(i <=10)
    {
         if(5 == i)
         {
              break;
         }
         printf("%d ",i);
         i++:
    }


    return 0;
}

这里打印的结果就是
1 2 3 4 6 7 8 9 10
那么为什么没5呢?

其实就是break的功能:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

continue介绍

int main()
{
     int i = 1;
     while(i <= 10)
     {
     
          if(5 == i)
          {
              continue;
          }
          printf("%d ",i);
          i++;
     }
}

这里打印的结果就是:
1 2 3 4 死循环
由此应该了解到了continue的作用了吧!

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

3.2 for循环

已经有了while循环但是为什么还要for循环呢?难道它有些其他的优点么。让我们一起探究一下
C语言分支与循环语句全面详解_第7张图片
下面写个代码展示一下:
打印1-10

#include
int main()
{
    int i = 0;
    for(i = 0;i<10;i++)
    {
        printf("%d ",i);
    }


    return 0;
}

和while循环对比一下:

#include
int main()
{
    int i = 0;
    for(i = 0;i<10;i++)
    {
        printf("%d ",i);
    }


    return 0;
}


#include
int  main()
{
    int i = 1;
    while(i <= 10)
    {
        printf("%d ",i);
        i++;
    }

    return 0;
}

对比一下你会发现while循环中存在循环中的三个条件,但是可能存在的过于疏远,查找和修改不够集中和方便。但是for循环却集中到了一起,用起来方便很多,也是比较常用的。

break和continue在for循环中的应用:
大家先看一下for循环的执行流程图。
C语言分支与循环语句全面详解_第8张图片
下面来写一些代码来加深理解:
break:

#include
int main()
{
    int i = 0;
    for(i = 1;i <= 10; i++)
    {
        if(7 == i)
        {
            break;
        }
        printf("%d ",i);
    }

    return 0;
}

结果是:1 2 3 4 5 6 7

break的作用就是直接结束循环。

continue:

#include
int main()
{
    int i = 0;
    for(i = 1;i <= 10; i++)
    {
        if(7 == i)
        {
            continue}
        printf("%d ",i);
    }

    return 0;
}

这里打印的结果是:1 2 3 4 5 6 8 9 10

continue的作用就是直接结束本次循环,然后进入到调整部分。

补充:

#include
int main()
{
    for(; ;)
    {
        printf("你好啊\n");
    }
    return 0;
}

这里的打印结果是无限打印 “ 你好啊 ”。因为此处省略了判断部分,因此循环判断的结果恒为真。

3.3 do while循环

C语言分支与循环语句全面详解_第9张图片

do while语句的特点就是:至少执行一次。

#include
int main()
{
    int i = 0;
    do
    {
        printf("%d ",i);
        i++;

    }while(i < 10);
}

0 1 2 3 4 5 6 7 8 9
break 和continue在do while循环中的作用
break

int main()
{
   int i = 0;
    do
    {
        if(6 == i)
        {
             break;
        } 
        printf("%d ",i);
        i++;

    }while(i < 10);
    return 0;
}

这里打印的是:1 2 3 4 5

break的作用是直接终止do while循环

continue

int main()
{
   int i = 0;
    do
    {
        if(6 == i)
        {
             continue;
        } 
        printf("%d ",i);
        i++;

    }while(i < 10);
    return 0;
}

这里的结果是:1 2 3 4 5 死循环

continue的作用是结束本次循环,直接到while判断部分。

4.goto语句

基本用法:

int main()
{
    flag:
    int i = 100;
    printf("%d ",i);
    goto flag;


}

这里会无限循环打印100

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上
goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

goto语句适合的场景:

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

了解了之后,这次的介绍就先到这里了哦!

你可能感兴趣的:(C系列,c语言,c++,c#)