8.C语言分支结构详解:掌握if语句与关系操作符

C语言分支结构详解:掌握if语句与关系操作符

C语言往期系列文章目录

往期回顾:

  1. C语言入门:解锁基础概念,动手实现首个C程序
  2. C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏
  3. C语言基础入门:数据类型、变量声明与创建详解
  4. C操作符详解,深入探索操作符与字符串处理
  5. 揭秘C语言输入输出内幕:printf与scanf的深度剖析


前言

C语言作为一门结构化的程序设计语言,其核心逻辑由顺序结构、选择结构(分支结构)和循环结构三大基础结构组成。这三种结构如同积木一般,能组合出任何复杂的程序逻辑。本文将重点解析分支结构的实现方式——if语句和switch语句,并深入探讨关系操作符的使用技巧,帮助大家掌握条件判断的核心机制。


一、分支结构:if语句

1. 基本语法

if 语句用于实现条件判断,其语法形式如下:

if (表达式) 
    语句;

​执行逻辑:若表达式结果为非0(真)​,则执行语句;若为0(假)​,则跳过该语句。

我们说表达式如果为真,语句执行,表达式为假,语句不执行。而在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是不是0,则语句执行。

示例:判断一个整数是否为奇数

#include <stdio.h>

int main() 
{
    int num = 0;
    scanf("%d", &num);
    if (num % 2 == 1)
        printf("%d是奇数\n", num);
    return 0;
}

在这里插入图片描述

2. 双分支:if-else语句

如果⼀个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?这里就需要 if…else… 语句了,语法形式如下:


if (表达式) 
    语句1;
else 
    语句2;

执行逻辑:表达式为真时执行语句1,否则执行语句2。

​示例:判断奇偶性

#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;
}

练习题:
输入一个年龄,>=18岁就输出:成年,否则就输出:未成年

3. 多语句控制:代码块

默认情况下,if和else仅控制紧接的一条语句。若需执行多条语句,需用{}包裹形成代码块:
示例:

int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >= 18)
        printf("成年了\n");    
        printf("可以谈恋爱了\n");  
    else                      
        printf("未成年\n");
        printf("最好不要谈恋爱\n"); 
    return 0;
}

为什么会报错呢?因为if 和else语句都默认只控制一条语句。所以我们想控制多条语句就可以用一个大括号括起来。

if (age >= 18) 
{
    printf("成年了\n"); 
    printf("可以谈恋爱了\n"); 
} 
else 
{
    printf("未成年\n");
    printf("最好不要谈恋爱\n"); 
}

由这个大括号括起来的语句,叫复合语句,代码块。

4. 嵌套if语句

复杂逻辑需通过嵌套if实现分层判断。

示例1:要求输入一个整数,判断输入的整数是0,还是正数或者负数。

if (num > 0)
    printf("正数\n");
else if (num < 0)
    printf("负数\n");
else
    printf("零\n");

这是一种逻辑,当然我们也可以去使用嵌套if

    if (num == 0) 
    {
        printf("输入的数字是0\n");
    } 
    else 
    {
        if (num > 0) 
        {
            printf("输入的数是正数\n");  
        } 
        else 
        {
            printf("输入的数是负数\n");
        }
    }

示例2:要求输入⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是整数。

if (num > 0) 
{
    if (num % 2 == 1)
        printf("奇数\n");
    else
        printf("偶数\n");
}
else 
{
	printf("非正数\n");
}

练习题:

输入一个人的年龄
如果年龄<18岁,打印“少年”
如果年龄在18岁至44岁打印“青年”
如果年龄在45岁至59岁打印“中老年”
如果年龄在68岁至89岁打印“老年”
如果90岁以上打印“老寿星”

5. 悬空else问题

代码陷阱:else始终与最近的未匹配if配对,而非依赖缩进。

下述代码的输出结果是什么?

#include <stdio.h>

int main() 
{
    int a = 0;
    int b = 2;
    
    if (a == 1) 
        if (b == 2) 
            printf("hehe\n");
    else 
        printf("haha\n");    
    return 0;
}

很多初学者,上来以判断 a 是0,不等于1,那就执行 else 子句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。

这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。 上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们以为 else 是和第⼀个if匹配的, *当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。

#include <stdio.h>

int main() {
    int a = 0;
    int b = 2;
    
    if (a == 1) 
    {
        if (b == 2) 
        {
            printf("hehe\n");
        }
    } 
    else {
        printf("haha\n");
    }
    return 0;
}

只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

二、关系操作符

1. 操作符类型

C语言提供6种关系操作符用于比较运算:

操作符含义
>大于
<小于
>=大于等于
<=小于等于
==相等
!=不相等

2. 使用注意

​返回值:关系表达式返回1(真)或0(假)。

​易错点:混淆==(判断相等)与=(赋值)。

if (a = 5) 
{ ... }   // 错误!将5赋值给a,表达式恒为真

if (a == 5) 
{ ... }  // 正确判断

另⼀个需要避免的错误是:多个关系运算符不宜连用。

上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

(i < j) < k

也就是 i 和 j 先比,比完后的结果再和k比。想要判断变量 j的值是否在 i 和 k 之间,应该使用下面的写法

i < j && j < k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值