C语言初阶-分支与循环语句

目录

1. 什么是语句?

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

2.1 if语句

案例:强调代码风格(前面也有说过一点)

2.2 switch语句

3. 循环语句

3.1 while循环

 break

continue

清理缓冲区

3.2 *for循环-用得最多

break

continue

建议

for循环的变种

3.3 do···while循环

break

continue

4. goto语句


分支语句

  • if

  • switch

循环语句

  • while

  • for

  • do while

goto语句

1. 什么是语句?

C语句分为5类:

  • 表达式语句

  • 函数调用语句

  • 控制语句

  • 复合语句

  • 空语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式。它们由特定的语句定义符组成,C语言有9种控制语句。

可分为以下三类:

  • 条件判断语句(分支语句):if语句、switch语句;

  • 循环执行语句:do while语句、while语句、for语句;

  • 转向语句:break语句、goto语句、continue语句、return语句。

C语言是结构化的程序设计语言。

结构化体现在如下图:

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

2.1 if语句

语法结构

//单分支
if(表达式)  //表达式结果为真或者非0,则执行下面语句
    语句;
//双分支
if(表达式)
    语句1;
else
    语句2;
//多分支
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
#include <stdio.h>
int main()
{
    int a = 10;
    if (a = 3)
        printf("hehe\n"); //hehe,赋值
    return 0;
}
#include <stdio.h>
int main()
{
    int a = 10;
    if (a == 3)
        printf("hehe\n"); //不打印,判断
    return 0;
}
#include <stdio.h>
int main()
{
    int age = 20;
    if (age > 18)
        printf("成年\n"); //成年
    return 0;
}
#include <stdio.h>
int main()
{
    int age = 20;
    if (age < 18)
        printf("未成年\n");
    else
        printf("成年\n");
    return 0;
}
//成年
#include <stdio.h>
int main()
{
    int age = 20;
    if (age < 18)
        printf("未成年\n");
        printf("不能饮酒\n");
    else
        printf("成年\n");
    return 0;
}
//error
#include <stdio.h>
int main()
{
    int age = 20;
    if (age < 18)
    {
        printf("未成年\n");
        printf("不能饮酒\n");
    }
    else
    {
        printf("成年\n");
    }
    return 0;
}
//成年

如果需要控制多条语句必须要添加{},否则error或者逻辑错误。

这里的一对{ }就是一个代码块。

#include <stdio.h>
int main()
{
    int age = 10;
    scanf("%d",&age);
    
    if (age < 18)
        printf("青少年\n");
    else if (age >= 18 && age < 40)
        printf("青年\n");
    else if (age >= 40 && age <= 100)
        printf("老年\n");
    else
        printf("老寿星\n");
    
    return 0;
}

如果表达式的结果为真,则语句执行。

在C语言中如何判断真假?0表示假,非0表示真。

案例:强调代码风格(前面也有说过一点)

无输出,else是和它离得最近的if匹配的

  • 变量的命名(有意义,规范)

  • 空格、空行、换行

推荐一本书:高质量C++/C编程指南(看前三章)

如果常量和变量进行比较,最好把常量放在左边,以免写错编译器不报错。

2.2 switch语句

switch语句常用于多分支的情况。

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

语句项就是一些case语句。

case 整型常量表达式:
    语句;
输入1,输出星期一;输入2,输出星期二···
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    if (1 == day)
        printf("星期1\n");
    else if (2 == day)
        printf("星期2\n");
    else if (3 == day)
        printf("星期3\n");
    else if (4 == day)
        printf("星期4\n");
    else if (5 == day)
        printf("星期5\n");
    else if (6 == day)
        printf("星期6\n");
    else
        printf("星期日\n");
        
    return 0;
}
输入1,输出星期一;输入2,输出星期二···
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch (day)
    {
        case 1:
            printf("星期1\n");
            break;
        case 2:
            printf("星期2\n");
            break;
        case 3:
            printf("星期3\n");
            break;
        case 4:
            printf("星期4\n");
            break;
        case 5:
            printf("星期5\n");
            break;
        case 6:
            printf("星期6\n");
            break;
        case 7:
            printf("星期日\n");
            break;
    }
    return 0;
}

case 字符 也可以,字符存储的是ASCII码,ASCII码也是整型常量。

//改变需求,输入1-5,输出地是"weekday";输入6-7,输出"weekend"
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch (day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch (day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
        default:
            printf("选择错误\n");
    }
    return 0;
}

switch语句可以嵌套使用。
break语句会跳出它所在的switch语句。

3. 循环语句

  • while

  • for

  • do while

3.1 while循环

while语句执行的流程:

while(表达式)
    循环语句;
#include <stdio.h>
int main()
{
    while(1)
    {
        printf("hehe\n");
    }
    return 0;
}
//一直循环打印hehe
//打印1-10数字
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        printf("%d ", i);
        i++;
    }
    return 0;
}

 break

//break跳出循环
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (5 == i)
        {
            break;
        }       
        printf("%d ", i);
        i++;
    }
    return 0;
}
//1 2 3 4

continue

//执行continue时,跳出本次while循环中continue后的代码,直接进行while条件的判断
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (5 == i)
        {
            continue;
        }       
        printf("%d ", i);
        i++;
    }
    return 0;
}
//1 2 3 4 死循环一直与while的条件表达式进行判断
#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        i++;
        if (5 == i)
        {
            continue;
        }       
        printf("%d ", i);
    }
    return 0;
}
// 2 3 4 6 7 8 9 10 11

while循环中的break是用于永久的终止循环。

continue跳过本次循环后面的代码,直接去判断部分,进行下一次循环的判断。

清理缓冲区

#include <stdio.h>
int main()
{
    //EOF; //双击,转到定义,查看值为-1,整型,char类型大小是1个字节放不下-1,所以下面定义类型为int,end of file
    int ch = getchar(); //w,getchar()获取一个字符,将其ASCII码值放在变量ch内
    printf("%c\n", ch); //w
    putchar(ch); //w,putchar()打印字符
    return 0;
}

MSDN:微软开发者网站

//用于清理缓冲区
#include <stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)  //getchar每次从缓冲区里读取一个字符
    {
        putchar(ch); //a
    }
    return 0;
}
//ctrl+c停止程序

 

//举例
#include <stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");
    scanf("%s",password); //输入123456
    
    getchar(); //读取\n
    
    printf("请输入密码(Y/N):>");
    int ret = getchar();
    if ('Y' == ret)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }
    return 0;
}
//getchar和scanf一样都不是从键盘上读取字符,而是从输入缓冲区里面读取。
//刚开始输入123456回车(其中回车就是\n)
//然后输入缓冲区接收到键盘输入的数据,等待getchar或scanf来读取
//scanf读取了123456,剩下\n,getchar就会读取,导致用户还没输入程序就中止了
//所以中间添加了getchar读取\n
//但是这种方式并不严谨,因为有时候需要清理的不止一个字符,而是一堆字符,详解如下 

scanf读取空格之前的字符,遇到空格就停止读取。

#include <stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");
    scanf("%s",password); //输入123456
    
    //getchar(); //读取\n
    //清理缓冲区的一堆字符
    int ch = 0;
    while ((ch = getchar()) != '\n')
    {
        ; 
    }
    
    printf("请输入密码(Y/N):>");
    int ret = getchar();
    if ('Y' == ret)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }
    return 0;
}
//只打印数字字符,跳过其它字符
#include <stdio.h>
int main()
{
    char ch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (ch < '0' || ch > '9')
            continue;
        putchar(ch);
    }
    return 0;
}

3.2 *for循环-用得最多

引入while循环的缺陷

//打印1-10 while循环
#include <stdio.h>
int main()
{
    int i = 1; //初始化
    while (i <= 10) //判断
    {
        printf("%d ", i);
        i++; //调整
    }
    return 0;
}
//上面影响循环的三个部分,当相隔较远时,修改其中一个部分改变此循环容易出现bug
for(表达式1;表达式2;表达式3)
    循环语句;

表达式1为初始化部分,用于初始化循环变量的。

表达式2为条件判断部分,用于判断循坏什么时侯终止。

表达式3为调整部分,用于循环条件的调整。

//打印1-10 for循环
#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        printf("%d ", i);
        printf("hehe\n");
    }
    return 0;
}
//循环语句不止一句时请使用{}

 

break

break只能跳出一个循环,如果存在嵌套循坏,每层都需要一个break才能全部跳出。

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        if (i == 5)
            break;
        printf("%d ", i);
    }
    return 0;
}
//1 2 3 4 

continue

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}
//1 2 3 4 6 7 8 9 10

对比while循环

 

建议

  • 不可在for循环体内修改循环变量,防止for循环失去控制。
  • 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//不可在for循环体内修改循环变量,防止for循环失去控制
#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        if (i == 5)
            continue;
        printf("%d ", i);
        i = 12;
    }
    return 0;
}
//1

具体视情况而定。

for循环的变种

省略判断部分

for循环的判断部分省略意味着判断会恒成立。

#include <stdio.h>
int i = 0;
for (;;)
{
    printf("hehe\n");
}
//死循环
#include <stdio.h>
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
    {
        printf("hehe\n");
    }
}
//打印9行hehe 
//3*3=9

省略初始化值

#include <stdio.h>
int i = 0;
int j = 0;
for (; i < 3; i++)
{
    for (; j < 3; j++)
    {
        printf("hehe\n");
    }
}
//打印3行hehe,再次循环时j没有初始化值,会使用上次跳出二层循环的j=3这个值
#include <stdio.h>
for (int i = 0; i < 10; i++)
{
    printf("hehe\n");
}
//打印10行hehe

C99语法才支持上面这种写法int i = 0。

C++中支持这种写法。

//循环0次,因为不是判断,是赋值,表达式2判断为0,则为假,直接跳出循环。改为2个等号,是比较,循环1次
#include <stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for (i = 0, k = 0; k = 0; i++, k++)
        k++;
    return 0;
}

3.3 do···while循环

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

场景:循环至少执行一次,上来就干循环语句。使用场景有限,不经常使用。

//打印1-10
#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i++;
    }
    while (i <= 10);
    return 0;
}

break

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if (i == 5)
            break;
        printf("%d ", i);
        i++;
    }
    while (i <= 10);
    return 0;
}
//1 2 3 4
#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        i++;
        if (i == 5)
            break;
        printf("%d ", i);
    }
    while (i <= 10);
    return 0;
}
//2 3 4

continue

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        i++;
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    while (i <= 10);
    return 0;
}
//2 3 4 6 7 8 9 10 11
//跳过printf,再次进行判断
#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if (i == 5)
            continue;
        printf("%d ", i);
        i++;
    }
    while (i <= 10);
    return 0;
}
//1 2 3 4 死循环
//continue,判断;continue,判断···

4. goto语句

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

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

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。

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

#include <stdio.h>
int main()
{
 again:
    printf("hehe\n");
    printf("haha\n");
    goto again;
    return 0;
}
//死循环,goto不能跨函数跳转

真正适合goto语句使用的场景

for (···)
    for (···)
    {
        for (···)
        {
            if (disaster)
                goto error;
        }
    }
    ···
error:
//处理错误情况
//关机程序
//1、电脑运行起来后,1分钟内关机
//2、如果输入:我是猪,就取消关机

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

int main()
{
    char input[20] = { 0 };
    system("shutdown -s -t 60");  //stdlib.h
again:
    printf("请注意你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
    scanf("%s", input);
    if (strcmp(input, "我是猪") == 0)  //string.h
    {
        system("shutdown -a");
    }
    else 
    {
        goto again;
    }
    return 0;
}

 循环替代goto语句

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

int main()
{
    char input[20] = { 0 };
    system("shutdown -s -t 60");
    while (1)
    {
        printf("请注意你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
        scanf("%s", input);
        if (strcmp(input, "我是猪") == 0)
        {
            system("shutdown -a");
            break;
        }
    }
    return 0;
}

  本周就暂且更新至此吧,期待下周再会。如有错误还请不吝赐教。

资源下载链接为: https://pan.quark.cn/s/1e68be2bff6a 这些压缩包文件里有大约60个小程序的源码示例,是学习小程序开发的优质资源。小程序是一种无需下载安装就能用的轻量级应用,广泛应用于生活服务、电商购物、社交互动等众多领域。研究这些源码,开发者能深入学习小程序开发技术和最佳实践。wx_app-master.zip可能是一个基础小程序项目模板,涵盖小程序的基本结构和组件使用。学习者可借此了解小程序的目录结构、配置文件,以及wxml、wxss和JavaScript的结合方式。BearDiary-master.zip和weapp-bear-diary-master.zip可能是日记类小程序示例,展示如何实现用户记录、查看和管理个人日记等功能,包括处理用户输入、存储数据和创建交互式界面。WXNews-master.zip和仿知乎日报.zip可能是新闻阅读类小程序的源码,使用网络请求API获取实时新闻数据并展示。学习者能通过这些代码学习处理网络请求、动态加载数据和设计适应性强的布局。wechat-weapp-gank-master.zip可能是一个类似“干货集中营”的技术分享平台小程序示例,涉及数据分类、搜索功能和用户交互设计,可学习如何组织和展示大量数据及实现筛选和搜索功能。Xiaoxiazhihu (知乎日报) 微信小程序 d.zip是仿知乎日报的小程序,涉及数据同步、新闻详情页设计和滑动效果实现,是模仿流行应用界面和用户体验的良好学习案例。仿豆瓣电影-demo.zip提供电影信息查询和展示功能,可能涉及API接口调用、数据解析以及评分和评论系统实现,有助于开发者理解如何集成外部服务和处理展示多媒体内容。仿今日头条app.zip类似今日头条的小程序,涵盖新闻推荐算法、个性化推荐和推送通知等复杂功能,能让开发者学习处理大数据流和提供个性化用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小汐睡着了

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值