【C语言】分支、循环语句2

首先在这里先和大家说明一下到现在才更新的原因吧。前一段时间,我在忙考研的调剂,或许是命中注定,我与南邮差了点缘分,差一分进复试。计算机考研的内卷相信大家都有所耳闻,在之后的调剂中,本人也是顺利的没有被任何学校看中。人生当中,成功只是暂时的,失败却是主旋律,而如何面对失败则把人分成了三六九等,既然往事已成定局,那就应当立足当下,提升自己。

接下来,废话不多说,进入今天的正题:循环语句。


目录

一、什么是循环

二、循环语句:while

三、循环语句:for

四、循环语句:do while

五、循环中的奇葩:goto

六、奇怪的循环


一、什么是循环

在介绍循环语句之前,我们首先要了解一下何为循环。在之前的介绍中,我们所提及的分支语句,是一种类似于线性结构的语句,一次判断一次执行,判断成立则执行,判断不成立则不执行,且只执行一次。但我们在实际编程中其实还会遇到一种情况:同一事件需要重复数次。这时候就需要用到我们今天所提到的循环语句。


二、循环语句:while

老规矩,先上代码

#include <stdio.h>

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int sz = sizeof(arr) / sizeof(arr[0]);
    int left = 0;
    int right = sz - 1;

    int key = 0;
    scanf("%d", &key);

    while (left < right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] > key)
        {
            right = mid - 1;
        }
        else if (arr[mid] < key)
        {
            left = mid + 1;
        }
        else
        {
            printf("找到了,下标是:%d\n", mid);
            break;
        }
    }
    if (left == right)
    {
        printf("找不到!\n")
    }
    return 0;
}

上述代码是一个经典的有序数组的二分查找。以此代码为例,我们可以看出,while语句有着和if语句相同的判断语句,二者的不同之处是:如果条件成立,if语句执行一次,而while语句则一直执行。因此,对于while语句来说,有一个重要的点:在循环中,满足某一条件后跳出循环。在二分查找中,left和right分别指向所要查找的数组两端,在每一次查找失败后,向中间靠拢,直到不满足left < right这个条件跳出,如果期间查找成功,则可以通过break直接跳出循环。而类似的continue也有跳出循环的功能,只不过continue只是跳出当前一次循环,如果判断语句依然成立,则循环继续执行,break则视为判断语句不成立,结束循环。在实际编程中,我们可以将判断语句写成1,即while(1),循环可以一直进行,然后通过break来跳出循环。

#include <stdio.h>

int main()
{
    int i = 0;
    int count = 0;

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

上述代码输出结果为:1 2 3 4 6 7 8 9。以此为例,我们可以清楚地看出continue在循环中的作用,即当 i 为5时跳过本次循环后续的打印。值得一提的是,若i++语句写在了if语句的后面,则此程序会陷入死循环,原因是:当 i 为5时跳过了i++,i 的值永远为5。


三、循环语句:for

 

类似于while循环,for循环也是可执行多次的语句。其不同之处在于for循环一开始就给定了初值、判断条件以及调整部分,相较于while循环而言,for循环将循环的三个必须条件放在了一起,代码风格更胜一筹,因此使用频率最高。在for循环中也存在break和continue的,作用与在while循环中相似,再次不再赘述。接下来看一段代码:

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int sz = sizeof(arr) / sizeof(arr[0]);
    
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        arr[i] = 0;
    }
    return 0;
]

以上述代码为例,for循环一般常用于遍历,包括对数组的遍历以及一组数据的遍历等。从代码风格来看,我们一般会写成for (i = 0; i < sz; i++),而不会写成for (i = 1; i < sz + 1; i++)。二者虽然从本质上来看是完全一致的,但前者能够更好地看出循环执行了多少次。对于for循环,还有两个值得注意的点,一是在循环内部,不能对循环变量 i 进行修改,以防止循环失控。二是初始化部分、判断部分和调整部分是可以省略的,但省略的意义不大,不做研究。

最后再补充一点,在vs编译器中可以通过打出for+Tab键快速打出for循环。


四、循环语句:do while

从上述的逻辑来看do while循环与while循环的区别就是:无论如何,do while循环都会执行一次,while循环如果一开始条件就不成立,就一次也不会进入循环。

#include <stdio.h>

int main()
{
    int input = 0;

    do
    {
        scanf("%d", &input);
        printf("%d\n", input);
    } while (input);

    return 0;
}

以上述代码为例,即使我们一开始的输入值为0,不满足判断条件,也依然会执行一次打印指令,如果是while循环,若输入值为0,则程序直接结束。do while循环中也可使用break和continue,用法与之前类似。不难看出,do while循环相较于while循环和for循环,使用场景有限,因而不经常使用。最后说明一点:do while循环在最后一定一定一定记得要加上分号!


五、循环中的奇葩:goto

无论是while循环、for循环还是do while循环都有对应的平判断语句和跳出循环的条件,但是这些对于我们最后要介绍的这个循环中的奇葩:goto来说,一个都不需要。

#include <stdio.h>
#include <string.h>

int main()
{
    char password[20] = {0};
    int n = 3;

Again:
    
    printf("请输入密码:)\n");
    scanf("%s", password);
    
    if (strcmp(password,"qwer1234asdf") == 0)
    {
        printf("密码输入正确!\n");
    }
    else
    {
        n--;
        if (0 == n)
        {
            printf("错误次数过多,请稍后重试!\n");
        }
        else
        {
            printf("密码输入错误,你还可以输入%d次!\n", n);
            goto Again;
        }
    }
    return 0;
}

以上述代码为例,我们就可以看出goto语句的简单粗暴,直接将程序的运行带入到指定的位置,运用起来十分的方便,但方便的背后也存在一个很大的隐患,就是goto语句容易使程序“乱飞”,造成逻辑上的混乱,在程序的书写和维护上都会造成比较大的困难,因此一般不建议使用。

六、奇怪的循环

本文的最后,给大家介绍一个奇怪的循环,程序执行后会死循环。在下一期的开头我们再来聊聊,这次保证不会再拖更了哦 O v O !

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int i = 0;

    for (i = 0; i <= 10; i++)
    {
        arr[i] = 0;
    }
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值