REGRET
blog

C语言初阶之分支与循环

前言

C语言是一门结构化的程序设计语言,主要分为三种结构:

  1. 顺序结构
  2. 选择结构
  3. 循环结构

分支语句和循环语句

问:什么是语句?答:C语言中由一个分号;隔开的就是一个语句

分支语句

  • if
  • switch

循环语句

  • while
  • for
  • do while

goto语句

一、分支语句(选择结构)

举个栗子:当你站在学习的分岔口时,你可以选择是否学习,然后当有一天你遇到了改变你命运的机会,那么这个时候:
好好学习+机遇=人生巅峰;不好好学习+机遇=回家放羊;
这就是选择,我们的每一个选择都决定着我们的人生(这个时候请富二代自行划走)。

1.if语句

if语句的三种语法结构:

        if(表达式)    //如果表达式为真,则执行语句
    语句;
        if(表达式)
    语句1;
        else(表达式)
    语句2;
        if(表达式)
    语句1;
        else if(表达式)
    语句2;
        else
    语句3;

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int age = 10;
    if(age>0 && age<18)
        printf("少年\n");
    else if(age>=18 && age<30)
        printf("青年\n");
    else if(age>=30 && age<50)
        printf("壮年\n");
    else if(age>=50 && age<150)
        printf("老年\n");
    else
    {
        printf("输入错误\n");
        printf("请更改\n");
    }
    return 0;
}
  • 解释(如果表达式为真,则执行语句):在C语言中如何表示真假:0表示假,非0表示真
  • if语句怎样使用多条语句:使用代码块{ },将语句放置在花括号中

错误示例(悬空else):

#include <stdio.h>

int main()
{
    int x=0;
    int s=1;
    if(x==1)// == 判断相等;= 赋值
        if(s==1)
            printf("文字\n");
    else
        printf("数字\n");
    return 0;
}
  • 注意:这种情况程序不执行

  • 原因:第一个表达式(x=1)不为真,并且没有else与之匹配,else与离它最近且未匹配的if进行配对。

适当的使用{}可以使代码的逻辑更加清楚,良好的代码风格很重要

例:

//对比1
if(condition)
{
    return x;
}
return y;
//----------
if(condition)
{
    return x;
}
else
{
    return y;
 }
//对比2
int num = 1;
if(num == 5)
{
    printf("hello\n");
}
//----------
int num = 1;
if(5 == num)
{
    printf("hello\n");
}

2.switch语句

switch语句也是分支语句的一种,它常常用于多分支的情况。

因为一直使用else if太麻烦了,所以有了switch语句。

    switch(整型表达式)
     {
        语句项;
     }

语句项就是一些case语句:

    case 整形常量表达式:
        语句;

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int win = 0;
    printf("请输入数字:");
    scanf("%d",&win);
    switch(win)
     {
     case 1:
         printf("IG");
         break;
     case 2:
         printf("FPX");
         break;
     case 3:
         printf("EDG");
         break;
     case 4:
         printf("RNG");
         break;
     case 5:
         printf("TES");
         break;
     default:
         printf("输入错误");
         break;
     }
    return 0;
}

注意:

1.想输出单个分支内容

在switch语句中,我们没办法直接实现分支,所以需要搭配break使用,break的实际效果就是把语句列表划分为不同的部分。

2.default语句

如果输入的东西与所有的case标签都不一样,可以加入一条default语句,程序就会执行default语句的内容,每个switch语句只能有一个default子句,但是它可以出现在语句列表的任何位置,语句流会向贯穿case标签一样贯穿default子句。

二、循环语句

再举个栗子:当你再次站在学习的分岔口时,这个时候你不一样了,你有身份,你是世界第二富的儿子,你还是可以选择是否学习:
好好学习+机遇=人生巅峰;不好好学习+自己制造机遇=人生巅峰;不好好学习+金钱的力量=人生巅峰;

1.while循环

我们已经了解了if语句,当满足条件时,if语句的执行只会执行一次,但实际上,同一件事,我们需要完成很多次,这个时候就需要用到while语句来帮助我们实现循环。

while语法结构:

    while(表达式)
        循环语句;

image

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int s = 1;
    while(s<=10)
    {
        /*
        if(s==9)
        continue;
        如果加上,会进入一个死循环,因为s++写在后面,
        当s等于9时,跳过了后面的代码,包括s++,
        所以s数值不变,返回循环是依然是9。
        */
        printf("%d\n",s );
        s++;
    }
    return 0;
}

补充:
continue用于终止循环中本次循环continue后的代码,直接跳到下一次循环入口。
break用于停止后面的所有循环,直接终止。

2.for循环

    for(表达式1;表达式2;表达式3)
        循环语句;
  1. 表达式1为初始化部分,用来初始化循环变量
  2. 表达式2为条件判断部分,用于判断循环什么时候终止
  3. 表达式3为调整部分,用于循环条件的调整

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int s = 0;
    for(s=1;s<=10;s++)
    printf("%d\n",s);
    return 0;
}

一些for循环的变种

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //变种1
    for(;;)
    {
        printf("hello\n");
    }
    //变种2
    int x, y;
    for (x = 0,y = 0 ; x<2 && y<5 ; ++x,y++)
    {
        printf("hello\n");
    }
    return 0;
}

for循环例题

请问循环要循环多少次?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 0;
    int k = 0;
    for(i = 0,k = 0;k = 0;i++,k++)
        k++;
    return 0;
}

循环进行了0次,k = 0,将0赋值给了k,0为假。

对比for循环与while循环

1.在while循环中依然存在循环的三个必要条件,但由于风格问题使它们离的比较远,所以修改不够集中和方便,与之相比,for循环风格更好,所以for循环的使用频率较高。

2.for循环中也可以使用break和continue,意义和while循环中的一样,只不过因为for循环的条件判断部分在前边,所以当使用continue是不会陷入死循环。

建议:
不可以在for循环体内修改循环变量,防止for循环失去控制
for循环的循环控制变量的取值采用“前闭后开区间”写法

3.do while循环

do语句的语法:

    do
        循环语句;
    while(表达式);

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int s = 1;
    do
    {
        printf("%d\n",s);
        s++;
    }
    while(s<=10);
    return 0;
}

do语句特点:
循环至少执行一次,使用的场景有限,所以不是经常使用。

折半查找算法

例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;
    int right = sizeof(arr)/sizeof(arr[0])-1;
    int key = 7;
    int mid = 0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
        else if(arr[mid] < key)
        {
            left = mid+1;
        }
        else
            break;
    }
    if(left <= right)
        printf("找到了,下标是%d\n", mid);
    else
        printf("找不到\n");
}

如果实现一个二分查找函数:

int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while(left<=right)
    {
        mid = (left+right)>>1;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
        else if(arr[mid] < key)
        {
            left = mid+1;
        }
        else
            return mid;//找到了,返回下标
    }
    return -1;//找不到
}

三、goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。

这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。

下面是使用goto语句的一个例子:一个关机程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入 停止 ,就取消关机!\n请输入:");
    scanf("%s", input);
    if(0 == strcmp(input,"停止"))
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
        return 0;
}

goto语言真正适合的场景如下:

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

结尾

分支与循环的内容就到此结束了,但是学习是不可以停止的。

posted on 2022-07-30 20:38  REGRET。  阅读(203)  评论(0编辑  收藏  举报