分支和循环语句 (1 / 2)

1. if 语句

1.1 if

if 语句的语法形式如下

scss 复制代码
if ( 表达式 )
    语句

表达式为真,则执行语句;表达式为假,则不执行该语句。

C语言中,0为假,非0表示为假。也就是说,当表达式的结果是0时,则语句不被执行;当表达式的结果是1时,则该语句被执行。

代码题:输入一个整数,判断是否为奇数

arduino 复制代码
# include <stdio.h>
int main()
{
    int num = 0;
    // 输入
    scanf("%d", &num);
    // 判断和输出
    if (num % 2 == 1)
        printf("%d 是奇数", num);
    return 0;
}

1.2 else

在上面的代码当中,我们可以看到如果过输入的数是一个奇数,它会输出该数是一个奇数。如果输入的一个数它不是奇数,而是一个偶数呢?

因此,我们对上面的代码题目进行变形,即:如果任意一个非零数的整数,我们要清除的判断是奇数还是偶数。这时我们就需要用到if...else...语句了,其语法格式如下

arduino 复制代码
if ( 表达式 )
    语句1
else
    语句2

若表达式为真,则执行语句1;若表达式为假,则执行语句2。

代码题:输入一个整数,判断是否为奇数,如果为奇数打印奇数,否者打印偶数

arduino 复制代码
# include <stdio.h>
int main()
{
    int num = 0;
    // 输入
    scanf("%d", &num);
    // 判断和输出
    if (num % 2 == 1)
        printf("%d 是奇数\n",num);
    else
        printf("%d 是偶数\n",num);
    return 0;
}

1.3 分支中包含多条语句

一个错误的代码举例

arduino 复制代码
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >= 18)
        printf("成年\n");
        printf("完全民事行为能力人\n");
    else
        printf("未成年\n");
        printf("限制或无民事行为能力人");
    return 0;
}

这个错误的原因是:在C语言默认情况下,ifelse的后面只能跟着一条语句

如果要跟多条语法的话,可以使用{},修正代码如下

arduino 复制代码
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >= 18)
    {
        printf("成年\n");
        printf("完全民事行为能力人\n");
    }
    else
    {
        printf("未成年\n");
        printf("限制或无民事行为能力人");
    }
    return 0;
}

1.4 嵌套if

if else语句中,else可以与另一个if语句连用,构成多重判断。

代码题:要求输入一个整数,判断输入的整数是0,还是正数或者负数。

  • 解答方式一:

    arduino 复制代码
    # include<stdio.h>
    int main()
    {
        int num = 0;
        // 输入
        scanf("%d", &num);
        // 判断和输出
        if (num == 0)
            printf("输入的值是0\n");
        else
        {
            if (num > 0)
                printf("输入的值是正数\n");
            else
                printf("输入的值是负数\n");
        }
        return 0;
    }
  • 解答方式二:也是比较推荐的写法

    arduino 复制代码
    # include <stdio.h>
    int main()
    {
        int num = 0;
        //输入
        scanf("%d", &num);
        // 判断和输出
        if (num == 0)
            printf("输入的值是0\n");
        else if (num > 0)
            printf("输入的值是正数\n");
        else
            printf("输入的值是负数\n");
        return 0;
    }

一个小练习:

输入一个人的年龄

如果年龄 < 18岁, 打印"少年"

如果年龄 在 18岁到44岁, 打印"青年"

如果年龄 在 45岁到59岁, 打印"中老年"

如果年龄 在 60岁到89岁, 打印"老年"

如果年90岁及以上, 打印"老寿星"

我将在本篇文档的末尾放入我的解答方案

如果有多个ifelse,可以记住这样一条规则,else总是跟最近的if匹配

我们首先从下面的代码开始

ini 复制代码
# include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("haha\n");
    else
        printf("hehe\n");
    return 0;
}

程序运行的结果是什么,

很多初学者,上来判断a是0,不等于1,那就执行else语句,打印hehe

但是当去运行该段代码,输出的结果实际上是啥都不输出

因此我们一定要养成良好的代码习惯,上段代码复制到编译器VS2022后会自动对齐即,else总是跟最近的if匹配,如下图所示

2. 关系操作符

C语言用于比较的表达式,称为 "关系表达式" ,里面使用的运算符就成为 "关系运算符" ,主要有下面6个

  • >: 大于运算符
  • <:小于运算符
  • >=:大于等于运算符
  • <=:小于等于运算符
  • ==:相等运算符
  • !=:不相等运算符

下面是一些例子

arduino 复制代码
# include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    // 输入
    scanf("%d %d", &a, &b);
    // 判断和输出
    if (a > b)
        printf("haha\n");
    else if (a < b)
        printf("hehe\n");
    else if (a == b)
        printf("xixi\n");
    return 0;
}

关系表达式通常返回01,表示真假

C语言中,0表示表达式为假,非零表示表达式为真, 比如40 > 36表达式返回值为1, 36 > 40表达式返回值为0

关系表达式常用于ifwhile结构。

注意区分: 赋值运算符 = 和 相等操作符 == ,有时候,虽然赋值运算符和相等操作符被混用,它可以运行,但很容易出现下面意想不到的结果。大家认为下面的代码会输出什么呢?

arduino 复制代码
#include <stdio.h>
int main()
{
    int a = (5 == 5);
    printf("%d\n", a);
    return 0;
}
  • 当一个变量和一个常量作比较的时候,应该怎么写?

    建议把常量放在 == 的左边

    arduino 复制代码
    #include <stdio.h>
    int main()
    {
        // = or ==
        int a = 5;
        if (5 == a)
        {
            printf("hehe\n");
        }
        return 0;
    }

关系操作符尽量不要连着使用,例如

ini 复制代码
#include <stdio.h>
int main()
{
    int a = 3;
    int b = 7;
    int c = 4;
    if (a < b < c)
        printf("hehe\n");
    return 0;
}

我们尝试运行该代码,程序判断表达式a<b<c为真,输出hehe

但是我们从数学的角度来看3<7<4显然是不正确,但是为什么程序会打印hehe

而在计算机的视角,连续的关系操作符,会从左向右依次判断,首先是判断a<b(3<7),表达式成立,此时3<7<4就写成了1<7,表达式以及成立,因此,程序判断表达式a<b<c为真,输出hehe

所以,要构造一个符合数学逻辑的关系操作的表达式,修改后的代码为

ini 复制代码
#include <stdio.h>
int main()
{
    int a = 3;
    int b = 7;
    int c = 4;
    /*if (a < b < c)
        printf("hehe\n");*/
    if (a < b && b < c)
        printf("hehe\n");
    return 0;
}

这里的&&逻辑且 ,即 a < b为真并且b < c为真时,表达式才为真

代码题:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年

arduino 复制代码
#include <stdio.h>
int main()
{
    int age = 0;
    // 输入
    scanf("%d", &age);
    // 判断和输出
    if (age >= 18 && age <= 36)
        printf("青年\n");
    return 0;
}

3. 条件操作符

条件操作符也叫做三目操作符,需要接受三个操作数,语法格式如下

exp1 ? exp2 : exp3

  • 说明:如果语句1表达式为真,则执行语句2;如果语句1表达式为假,则执行语句3

代码题:使用条件表达式实现找两个数中的最大值

arduino 复制代码
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    int m = (a > b ? a : b);
    printf("m = %d\n", m);
    return 0;
}

4. 逻辑操作符:&&,||,!

逻辑运算符提供逻辑判断功能,用来构建更复杂的表达式,主要有下面三个运算符

  • !: 逻辑取反运算符(它能够改变单个运算符的真假)
  • &&:逻辑与运算符,就是并且的意思。也就是说,当&&两侧的表达式都是真的时候,整个表达式才为真;两侧的表达式只要有一个为假,那么整个表达式就是假的。
  • ||:逻辑或运算符,就是或者的意思。也就是说,当||两侧的表达式只要有一个为真,那么整个表达式就为真;当两侧的表达式全为假时,整个表达式才为假。

注意: C语言中,非0表示真,0表示假。

逻辑取反运算符 !

a !a
非0 0
0 1

比如,我们有一个变量叫做flag,如果flag为假,要做一个什么事情,就可以写出下面的代码

arduino 复制代码
#include <stdio.h>
int main()
{
    int flag = 5;
    scanf("%d", &flag);
    if (!flag) // flag 为假要做什么事
    {
        printf("haha\n");
    }
    return 0;
}

如果flag为真,!flag就是假;如果flag为假,!flag就是真。所以该段代码的意思就是如果flag为假,执行if语句中的代码。

逻辑与运算符 &&

表达式:a 表达式:b 表达式:a&&b
非0 非0 1
非0 0 0
0 非0 0
0 0 0

&&就是逻辑与运算符,就是并且的意思。&&是一个双目操作符,使用的方式是a&&b,&&两边的表达式都是真的时候,整个表达式才为真;只要有一个表达式是假的,则整个表达式为假。

例如,一年当中哪些月份是春天?

请使用代码实现,输入一个月份,判断他是不是春天。

思路: 一年有1月~12月,这其中,3月,4月,5月是春天,

假设我们的输入是x,此时x必需满足:

3 <= x <= 5

也就是,既要满足大于等于3,又要满足小于等于5

以下是示例代码:

arduino 复制代码
#include<stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if (month >= 3 && month <= 5)
    {
        printf("春天\n");
    }
    return 0;
}

逻辑或运算符 ||

||就是逻辑或运算符,就是或者的意思。||是一个双目操作符,使用的方式是a||b,||两边的表达式只要有一个表达式是真的,则整个表达式为真;两边的表达式都是假的时候,整个表达式才为假。

例如,一年当中哪些月份是冬天?

请使用代码实现,输入一个月份,判断他是不是冬天。

思路: 一年有1月~12月,这其中,1月,2月,12月是冬天,

假设我们的输入是x,此时x必需满足:

x == 1 或者 x == 2 或者 x == 12

也就是,输入的x满足:等于1,等于2 ,等于12

三个等式满足其中一个即可

以下是示例代码:

arduino 复制代码
#include<stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if (month == 1 || month == 2 || month == 12)
    {
        printf("冬天\n");
    }
    return 0;
}

练习:闰年的判断

输入一个年份year,判断year是否式闰年

闰年的判断规则:(下面的条件满足其中一个即可)

  1. 能被4整除并且不能够被100整除的是闰年
  2. 能被400整除的是闰年

以下是一段代码示例

arduino 复制代码
#include<stdio.h>
int main()
{
    int year = 0;
    scanf("%d", &year);
    
    //方法1
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    {
        printf("%d 是闰年", year);
    }
​
    // 方法2
    if ((year % 4 == 0) && (year % 100 != 0))
    {
        printf("%d 是闰年", year);
    }
    else if (year % 400 == 0)
    {
        printf("%d 是闰年", year);
    }
    return 0;
}

短路

C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是可以保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为**''短路"**

像前面的代码:

sql 复制代码
if (month >= 3 && month <= 5)

表达式中&&的左边操作数是 month >= 3,右边的操作数为month <= 5。当输入的值不满足左边的操作数 month >= 3时,即使不判断右边的操作数month <= 5,也能够得出整个表达式的结果为假 (值为0)。

也就是说对于逻辑与运算符 --- &&,左边操作数的结果为0时,右边的操作数就不再执行。

那么对于逻辑或运算符 --- || 呢?我们结合前面的代码:

sql 复制代码
if (month == 1 || month == 2 || month == 12)

如果输入的值满足 month == 1,则不用再判断month是否等于212,整个表达式为真(值为1)。

所以,逻辑或运算符 --- || 的左边操作数的结果不为0时,就无需执行右边操作数。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值

下面是一个关于短路求值的问题的代码示例

css 复制代码
#include<stdio.h>
int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    // 问题1
    i = (a++ && ++b && d++);
    // 问题2 
    i = (a++ || ++b || d++);
    printf("i = %d, a = %d, b = %d, c = %d, d = %d", i, a, b, c, d);
    return 0;
}

参考代码 1.4 节练习

  • 方法1

    arduino 复制代码
    # include <stdio.h>
    int main()
    {
        int age = 0;
        // 输入
        scanf("%d", &age);
        // 判断和输出
        if (age < 18)
            printf("未成年\n");
        else if (age <= 44)
            printf("青年\n");
        else if (age <= 59)
            printf("中老年");
        else if (age <= 89)
            printf("老年");
        else
            printf("老寿星");
        return 0;
    }
  • 方法2

    arduino 复制代码
    # include <stdio.h>
    int main()
    {
        int age = 0;
        // 输入
        scanf("%d", &age);
        // 判断和输出
        if (age < 18)
            printf("未成年\n");
        else
        {
            if (age <= 44)
                printf("青年\n");
            else
            {
                if (age <= 59)
                    printf("中老年");
                else
                {
                    if (age <= 89)
                        printf("老年");
                    else
                        printf("老寿星");
                }
            }
        }
        return 0;
    }

来源

本篇文章来自于b站鹏哥C语言教学视频的学习笔记

相关推荐
艾莉丝努力练剑2 小时前
【数据结构与算法】数据结构初阶:详解顺序表和链表(四)——单链表(下)
c语言·开发语言·数据结构·学习·算法·链表
秋说4 小时前
【PTA数据结构 | C语言版】根据层序序列重构二叉树
c语言·数据结构·算法
秋说5 小时前
【PTA数据结构 | C语言版】前序遍历二叉树
c语言·数据结构·算法
秋说7 小时前
【PTA数据结构 | C语言版】二叉树层序序列化
c语言·数据结构·算法
lzb_kkk10 小时前
【C++】多线程同步三剑客介绍
c语言·c++·条件变量·互斥锁·信号量
耳总是一颗苹果11 小时前
C语言---自定义类型(下)(枚举和联合类型)
c语言·开发语言
秋说11 小时前
【PTA数据结构 | C语言版】根据前序序列重构二叉树
c语言·数据结构·算法
梁辰兴13 小时前
数据结构:栈和队列
c语言·数据结构·算法·c··队列
持梦远方15 小时前
探索 Sort.h:多功能排序算法模板库
c语言·数据结构·算法·排序算法·c++模板库·排序算法模板库