【分支和循环语句,等等,别走,听我讲完】

上回说到,分支和循环语句的分支语句,那么今天我们来补完循环语句,虽然两部分分布时间离得有点远,但是……(流汗)。
循环语句说白就是一直不停做某事,虽然重复,但每次都有不同的变化,为了满足需要,C语言诞生了三种循环语句,分别是for,while,do...while。接下来,请允许我向你们依次介绍。

while循环的表达式

while(表达式)
语句
类似if语句的表达式
if(表达式)
语句

运行逻辑

表达式用于判断是否执行,若表达式为真,则循环一次,如此反复。

表达式的说明

while的表达式其实是满足循环的条件,这个表达式为合法的任意类型的表达式,我认为,这个表达式常用到
1.双目运算符(甚至复合)如:while(a > b),while(a > 0 && b < 100)
2.单个变量(就是利用变量是否为真)如:while(a),一般结合a--;
3.死循环(1),一般结合break;
4.函数返回值 while(Add( )) ,Add() 是一个函数调用表达式,其返回值被用作循环条件。
5.赋值表达式 while ((c = getchar()) != '\n') 表示每次循环都会从输入中读取一个字符并赋值给 c ,然后检查它是否不等于换行符。

细节

加上大括号,才能包含二个及以上的语句

for循环的表达式

for(表达式1,表达式2,表达式3)
语句
表达式1:循环变量的初始化
表达式2:循环结束条件的判断
表达式3:循环变量的调整

运行逻辑

第一次循环,从表达式1到2到3。
第二至n次,从2至3,也就是表达1初始化部分只执行一次

细节

加上大括号,才能包含二个及以上的语句
表达1初始化部分只执行一次

while循环与for循环的对比

while和for都有初始化,判断,调整
while的初始化,和调整去哪了,初始化在while之前,调整在大括号**
int i = 0;
while(i < 10)
{
i++
}
总的来说,for循环相对集中,更易修改

do...while的表达式

do
语句
while(表达式);
不同于for和while循环语句,它至少执行一次

运行逻辑

先执行一次,再判断表达式是否为真,真就继续循环,假就不循环

细节

表达式后的逗号易忽略
加上大括号,才能包含二个及以上的语句

break和continue语句在for,while,do...while循环中的运用

首先,我认为这里break可以翻译为终止,continue可以翻译为继续,首先,我们看一下二者在while循环语句的作用**
#include<stdio.h>

int main()

{

        int i = 0;

        while (i < 4)

        {

               printf("%d", i);

               break;

               i++;

        }

        return 0;

}

结果是0
若无break,结果是0 1 2 3 



#include<stdio.h>

int main()

{

        int i = 0;

        while (i < 4)

        {

               printf("%d", i);

               continue;

               i++;

        }

        return 0;

}

结果是死循环0
可见,break是终止一个循环语句,countinue是在循环体(大括号及大括号里的内容)内跳过后面的代码

接下来,是for循环语句了

#include<stdio.h>

int main()

{

        int i = 0;

        for (i = 0; i < 10; i++)

        {

               if (i == 5)

               {

                       break;

               }

               printf("%d ", i);



        }

        return 0;

}

结果是0 1  2 3 4
#include<stdio.h>

int main()

{

        int i = 0;

        for (i = 0; i < 10; i++)

        {

               if (i == 5)

               {

                       continue;

               }

               printf("%d ", i);



        }

        return 0;

}

结果是0 1 2 3 4  6 7 8 9 
这里,不得不提continue在whlie和for两种循环语句一些区别了,一般而言,使用continue后,前者会跳过i(即自变量)调整部分,后者往往不会

接下来是do…while循环语句

作用几乎一模一样
#include<stdio.h>

int main()

{

        int i = 0;

        do

        {

               printf("%d ", i);

               i++;

               if (i == 5)

               {

                       break;

               }

        } while (i < 10);

        return 0;

}

结果是0 1 2 3 4
#include<stdio.h>

int main()

{

        int i = 0;

        do

        {

               printf("%d ", i);

               i++;

               if (i == 5)

               {

                       continue;

               }

        } while (i < 10);

        return 0;

}

结果是0 1 2 3 4 5 6 7 8 9 因为continue的后面无其他语句了,所以打印了5
接下来,便是重头戏

三种循环的嵌套

for,while,do...while均存在嵌套,就是每一种循环即在它本身的大括号里再用它自己,也可以用另一种循环(注意是一种)
#include <stdio.h>

int main() {
    // 外层循环控制行
    for (int i = 0; i < 3; i++) {
        // 中层循环控制列
        for (int j = 0; j < 3; j++) {
            // 内层循环控制特定的操作
            int k = 0;
            while (k < 3) {
                printf("i: %d, j: %d, k: %d\n", i, j, k);
                k++;
            }
        }
    }
    return 0;
}
 break是永久的终止循环,但每次只能跳出一个循环语句,三层嵌套则需要三次break才能完全跳出
goto语句
goto用于一个函数内部的跳转(不可以从一个函数跳到另一个,只能在一个函数内部跳)
这个函数可以是主函数(即main),也可以是库函数,自定义函数
#include <stdio.h>

int main()

{

    int i;

    outer_loop: // 标签

    for (i = 0; i < 5; i++)

    {

        if (i == 3)

        {

            goto outer_loop; // 跳转到 outer_loop 标签

        }

        printf("%d ", i);

    }

    return 0;

}




#include <stdio.h>

void process_data(int* data)

{

    if (data == NULL)

    {

        goto error; // 如果数据指针为空,跳转到 error 标签

    }

    // 处理数据...

    printf("Processing data...\n");

    return;



    error:

    printf("Error: Null pointer provided.\n");

}



#include <stdio.h>

void custom_function() 

{

    int condition = 1;

    start:

    if (condition) 

    {

        printf("Condition is true.\n");

        condition = 0; // 改变条件,以便下次循环时不打印

        goto start; // 跳转回 start 标签

    }

}

int main() 

{

    custom_function();

    return 0;

}


接下来,就是用这三种循环语句实现一个小游戏(猜数字游戏)
#include<stdio.h>

#include<time.h>

#include<stdlib.h>

void game( )

{

        int count = 5;

        int r = rand() % 100 + 1;

        int n = 0;

        while(count)

        {

               printf("还剩%d次机会\n",count);

               printf("请猜数字>:");

               scanf("%d", &n);

               if (n > r)

               {

                       printf("猜大了\n");

               }

               else if (n < r)

               {

                       printf("猜小了\n");

               }

               else if (n == r)

               {

                       printf("猜对了\n");

                       break;

               }

               count--;

               if (count == 0)

               {

                       printf("失败了,正确答案是%d\n",r);

                       break;

               }

        }

}

void menu()

{

        printf("***************\n");

        printf("*****1.play****\n");

        printf("*****0.exit****\n");

        printf("***************\n");

}

int main()

{

        int input = 0;

        srand((unsigned int)time(NULL));

        do

        {

               menu();

               printf("请选择:>");

               scanf("%d", &input);

               switch (input)

               {

               case 1:

                       game();

                       break;

               case 0:

                       printf("游戏结束");

                       break;

               default:

                       printf("请重新输入");

                       break;

               }

        } while (input);

        return 0;

}
好吧,其实只用了while,do...while两种循环语句
注意:rand函数是生成伪随机数的,srand函数是使rand函数真正生成的是随机数,srand函数我们只需调用一次就行,先记住吧,毕竟这不是重点。rand函数使用,要用到头文件《stdlib.h》,由于srand函数里使用了time函数,要用到头文件《time.h》。

补充说明一下:

生成0~99的随机数
rand()%100
生成0~100的随机数
rand()%100+1
生成100~200的随机数
100+rand()%100+1
生成a~b的随机数(a>=100)
a+rand()%(b-a)+1

希望我的内容可以对你产生帮助,加油哦,宝子们

这里对上一期的内容进行纠正,很抱歉,对大家产生了一定的误解

这里不应该出现for的,不好意思


这里补充一下

if (month >= 3 && month =< 5)

{

        printf("Spring");

}

当输入month = 2时,既然左操作数(month >= 3)为假,右操作数(month <= 5)也不用去判断month = 2
if (month == 12 || month == 1 || month == 2)

{

        printf("Winter");

}

当输入month = 12时,既然左操作数(month == 12)为真,右操作数(month == 1 || month == 2)(这里左,右操作数相对于第一个||)month不用去判断month = 2

或者(表达式两侧至少有一个为真则假,没有表式为真则假)纠正为
或者(表达式两侧至少有一个为真则真,没有表式为真则假)

另外,补充说明一下

左,右操作数

if (month == 12 || month == 1 || month == 2)

{

        printf("Winter");

}
1. 第一个比较运算:  month == 12
左操作数:  month  右操作数:  12 
2. 第二个比较运算: month == 1
   左操作数:month   右操作数:  1  
3. 第三个比较运算:  month == 2  
左操作数:  month  右操作数:  2
对于第一个||
左操作数:  month == 12  
右操作数:  month == 1 || month == 2 
总之,在编程语言中,左操作数和右操作数是相对于二元运算符而言的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值