【C++】深入理解 if-else 语句


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯if-else 语句基础概述
    • 1.1 if 语句
    • 1.2 else 语句
      • 注意事项:
    • 1.3 单条语句和语句块的区别
  • 💯else if 语句与嵌套 if
    • 2.1 else if 的本质
    • 2.2 else if 的优势
  • 💯悬空 else 问题
    • 3.1 悬空 else 的原因
    • 3.2 如何解决悬空 else
    • 3.3 总结建议
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 编程中,条件判断语句是逻辑控制的核心部分。if-else 语句是编写条件逻辑的基础,用于根据不同条件来执行不同的操作路径。本篇文章将详细阐述 ifelse if、嵌套 if 以及常见的 “悬空 else” 问题,并配以代码示例和深入的概念分析,旨在帮助读者彻底掌握这些关键概念,为编写健壮且可维护的代码打下坚实基础。
    C++ 参考手册
    在这里插入图片描述

💯if-else 语句基础概述

在这里插入图片描述


1.1 if 语句

if 语句是条件控制语句的基础,用于判断某个条件是否成立,从而决定程序的执行路径。其语法格式如下:

if (表达式)
    语句;
  • 表达式:判断条件,如果为真(非 0),则执行 if 后的语句;如果为假(0),则跳过该语句。
  • if 后可以跟单条语句,也可以跟语句块(用 {} 包裹的多条语句)。

示例题目:输入一个正整数 n,判断 n 是否为奇数。

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    cin >> n;
    if (n % 2 == 1)
        cout << n << " 是奇数" << endl;
    return 0;
}

在这里插入图片描述

在上面的代码中,我们通过 n % 2 == 1 来判断输入的数字 n 是否为奇数。由于 if 后的语句只有一行,因此可以不使用 {},但在实际开发中,养成使用 {} 的习惯有助于提高代码的可读性和可维护性,特别是在将来需要扩展逻辑时。


1.2 else 语句

else 语句用于在 if 条件为假时执行其他操作,与 if 搭配使用,以处理所有未满足 if 条件的情况。

示例题目:输入一个正整数 n,如果是奇数则打印 “奇数”,否则打印 “偶数”。

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    cin >> n;
    if (n % 2 == 1)
        cout << n << " 是奇数" << endl;
    else
        cout << n << " 是偶数" << endl;
    return 0;
}

在这里插入图片描述

在此示例中,我们增加了 else 分支来处理 if 条件不成立的情况。如果 n 不是奇数,则它必然是偶数,因此 else 分支输出相应的结果。


注意事项:

  • ifelse 后面不能加分号。例如:

    if (n % 2 == 1);
        cout << n << " 是奇数" << endl;
    

    在这里插入图片描述

    上述写法导致 if 语句后面紧跟一个空语句,因此输出语句始终被独立执行,这种错误很容易被忽略,造成逻辑偏差。


1.3 单条语句和语句块的区别

在条件判断语句中,代码结构和组织的清晰性至关重要,尤其是在处理多个语句时。

  • 单条语句可以省略 {}:如果 ifelse 后只有一条语句,可以省略 {}。但为了代码的可维护性和扩展性,建议始终使用 {},即使只有一条语句,这样在后续增加新逻辑时可以避免潜在的错误。
  • 多条语句必须加 {}:如果 ifelse 后的逻辑包含多条语句,必须用 {} 包裹,形成一个语句块。

示例

#include <iostream>
using namespace std;

int main() {
    int n = 3;
    if (n % 2 == 1) {
        cout << n << " 是奇数" << endl;
        cout << "这是一个奇数的判断逻辑块" << endl;
    } else {
        cout << n << " 是偶数" << endl;
        cout << "这是一个偶数的判断逻辑块" << endl;
    }
    return 0;
}

在这里插入图片描述

在这个示例中,ifelse 后的逻辑包含多条语句,因此必须使用 {} 来保证代码的逻辑正确性。即使在只有一条语句的情况下,养成加 {} 的好习惯可以减少未来修改代码时可能引入的错误。


💯else if 语句与嵌套 if

在这里插入图片描述


2.1 else if 的本质

else if 语句是处理多重条件判断的语法糖,本质上是 else 分支中嵌套 if 语句。通过使用 else if,可以使代码更加简洁,避免多层嵌套导致的逻辑复杂性。

在实际开发中,经常需要对同一个变量进行多条件判断。例如,要判断一个整数是正数、负数还是零,我们可以使用嵌套的 if,也可以使用 else if,两者在逻辑上是等价的。

嵌套 if 示例

#include <iostream>
using namespace std;

int main() {
    int n = 6;
    if (n > 0) {
        cout << n << " 是正数" << endl;
    } else {
        if (n < 0) {
            cout << n << " 是负数" << endl;
        } else {
            cout << n << " 是零" << endl;
        }
    }
    return 0;
}

在这里插入图片描述

在上述代码中,我们在 else 分支中嵌套了一个 if,用于判断 n 是否为负数。如果不是正数也不是负数,那么它必然是零。

else if 简化写法

#include <iostream>
using namespace std;

int main() {
    int n = 3;
    if (n > 0) {
        cout << n << " 是正数" << endl;
    } else if (n < 0) {
        cout << n << " 是负数" << endl;
    } else {
        cout << n << " 是零" << endl;
    }
    return 0;
}

在这里插入图片描述

通过使用 else if,我们可以在代码中清晰地表达多个条件判断,逻辑上与嵌套 if 等价,但代码结构更为扁平化和直观。这种写法使得程序逻辑更加清晰,并且在代码审查和维护时更易理解。


2.2 else if 的优势

使用 else if 的主要优势在于代码的可读性和可维护性。在复杂的判断逻辑中,嵌套的 if 可能会导致嵌套层次过深,进而使代码难以阅读和理解。而通过 else if,可以有效避免这种问题,使代码逻辑更加扁平化,易于追踪和调试。

例如,在需要对同一变量进行多次不同判断的情况下,else if 使得代码的执行路径更加明确,而不必多次嵌套和缩进,避免不必要的代码复杂性。
在这里插入图片描述


💯悬空 else 问题

在这里插入图片描述


3.1 悬空 else 的原因

悬空 else(dangling else)问题是指在多个嵌套的 if 语句中,else 会与最近的未被匹配的 if 配对。这可能会导致逻辑上的误解或错误,尤其是在代码未正确使用 {} 时。

示例代码

#include <iostream>
using namespace std;

int main() {
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            cout << "hehe" << endl;
        else
            cout << "haha" << endl;
    return 0;
}

在这里插入图片描述

在这段代码中,else 实际上与最近的 if (b == 2) 配对,而不是与第一个 if (a == 1) 配对。这导致当 a != 1 时,程序不会有任何输出,因为 else 只与最近的 if 配对。这种逻辑错误非常隐蔽,尤其是在复杂的条件分支中,很容易被忽视。


3.2 如何解决悬空 else

为了避免这种问题,应该使用大括号 {} 来明确语句的归属。通过使用 {},可以确保 else 正确地与预期的 if 配对,从而使代码逻辑更加清晰。

修正后的代码

#include <iostream>
using namespace std;

int main() {
    int a = 0;
    int b = 2;
    if (a == 1) {
        if (b == 2) {
            cout << "hehe" << endl;
        }
    } else {
        cout << "haha" << endl;
    }
    return 0;
}

在这里插入图片描述

通过使用 {},明确了 else 应该配对的是最外层的 if (a == 1),从而避免逻辑错误。这样,代码的执行逻辑更加明确,符合直观的逻辑思维。


3.3 总结建议

在这里插入图片描述

  • 在编写多重嵌套的 if-else 时,务必使用 {} 来明确逻辑结构,防止悬空 else 问题。
  • 即使是单条语句,也建议使用 {},这样可以提高代码的可读性和维护性。
  • 对于复杂的条件判断逻辑,可以考虑重构代码,将多重嵌套的 if 改写为 else if 结构,使代码更加扁平化,逻辑更加清晰。

💯小结

  • 在这里插入图片描述
    if-else 基础if 用于条件为真时执行代码,else 处理其余情况。if 语句是条件判断的基础,结合 else 可以完成简单的二选一逻辑。
  • 语句块与 {}:单条语句可以省略 {},但多条语句必须使用 {}。建议统一使用 {},以提高代码的可读性和安全性。在复杂逻辑的编写中,使用 {} 能有效减少出错的几率。
  • else if 简化嵌套else if 是嵌套 if 的简化形式,便于实现多条件判断,代码更加简洁易懂。在条件较多的情况下,else if 比多层嵌套的 if 更加高效且易于理解。
  • 悬空 else 问题else 默认与最近的 if 配对,使用 {} 可以明确逻辑归属,避免潜在的逻辑错误。为了确保逻辑的清晰和准确,应当尽量减少嵌套的复杂度,使用 {} 来明确每个 if-else 的关系。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/929732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十七、监控与度量-Prometheus/Grafana/Actuator

文章目录 前言一、Spring Boot Actuator1. 简介2. 添加依赖2. 开启端点3. 暴露端点4. 总结 二、Prometheus1. 简介2. Prometheus客户端3. Prometheus服务端4. 总结 三、Grafana1. 简介2. Grafana安装3. Grafana配置 前言 系统监控‌ 在企业级的应用中&#xff0c;系统监控至关…

在c#控制台中使用Raylib-cs库,绘制控制小球和插入音频(附带c++中小球的控制代码)

下载网址 GitHub - chrisdill/raylib-cs: C# bindings for raylib, a simple and easy-to-use library to learn videogames programming 克隆库 克隆GitHub仓库-CSDN博客 1 .制作dll 点击 生成之后就会多出这些东西 2.在项目中添加dll 然后就导进来了 测试一下用例代码 …

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测&#xff0c;自动驾驶技术正迅速发展&#xff0c;预计在未来几年内将带来显著的商业效益&#xff0c;特别是在决策智能和边缘人工智能领域。目前&#xff0c;一家领军企业正积极拥抱基于大模型的数字化转型之路&#xff0c;作为自动驾驶领域的佼佼者&…

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…

数组常见查找算法

文章目录 时间复杂度1. 顺序查找&#xff08;Linear Search&#xff09;2. 二分查找&#xff08;Binary Search&#xff09;3. 插值查找&#xff08;Interpolation Search&#xff09;4.分块查找5.哈希查找 时间复杂度 衡量算法执行时间随输入规模增长而增长的速度的一个概念。…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

CountDownLatch、Semaphore和Cyclicbarrier

文章目录 前言一、CountDownLatch1、概念2、源码3、代码示例&#xff1a;4、应用场景&#xff1a; 二、Semaphore1.概念2.源码3.代码示例4.应用场景 三、Cyclicbarrier1、简介2、源码3、代码示例4、应用场景&#xff1a;5、CyclicBarrier对比CountDownLatch 总结 前言 countDo…

【开源免费】基于Vue和SpringBoot的课程答疑系统(附论文)

博主说明&#xff1a;本文项目编号 T 070 &#xff0c;文末自助获取源码 \color{red}{T070&#xff0c;文末自助获取源码} T070&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

Flink 中双流 Join 的深度解析与实战

目录 一、Join 算子 一&#xff09;语义与特性 二&#xff09;通用用法 三&#xff09;不同窗口类型表现 滚动窗口 Join 滑动窗口 Join 二、CoGroup 算子 一&#xff09;功能特点 二&#xff09;通用用法与连接类型实现 内连接&#xff08;InnerJoin&#xff09; 左…

QNX的内存布局和启动入口

参考资料: QNX官网文档 内存布局 添加图片注释,不超过 140 字(可选) 查看系统内存布局 # pidin syspage=asinfo Header size=0x00000108, Total Size=0x0000d1b0, #Cpu=8, Type=257 Section:asinfo offset:0x0000bdf0 size:0x00000d00 elsize:0x000000200000

数学建模之RSR秩和比综合评价法(详细)

RSR秩和比综合评价法 一、概述 秩和比法(Rank-sum ratio&#xff0c;简称RSR法)是我国学者田凤调于1988年提出的&#xff0c;田教授是我国杰出的卫生统计学家&#xff0c;该方法最初提出时用于解决医学卫生领域的综合评价问题&#xff0c;后经各领域学者的补充和完善&#xf…

计算机网络复习6——网络层

域名系统NDS NDS是互联网的命名系统&#xff0c;用来把便于人们使用的机器名字转换为IP地址&#xff0c;作为人与机器之间的中间件 域名 域名是主机的名字 域名使用层次树状结构&#xff0c;由标号序列组成&#xff0c;各标号之间用点隔开&#xff0c;每个名字在互联网上是…

【PlantUML系列】类图(一)

目录 一、类 二、接口 三、抽象类 四、泛型类 五、类之间的关系 六、添加注释 七、包图 八、皮肤参数 一、类 使用class关键字定义类&#xff0c;类名后跟大括号&#xff0c;声明类的属性和方法。 属性&#xff1a;格式为{visibility} attributeName : AttributeType…

【AI系统】FBNet 系列

FBNet 系列 本文主要介绍 FBNet 系列&#xff0c;在这一章会给大家带来三种版本的 FBNet 网络&#xff0c;从基本 NAS 搜索方法开始&#xff0c;到 v3 版本的独特方法。在本节中读者会了解到如何用 NAS 搜索出最好的网络和训练参数。 FBNet V1 模型 FBNetV1:完全基于 NAS 搜…

高校数字化运营平台解决方案:构建统一的服务大厅、业务平台、办公平台,助力打造智慧校园

教育数字化是建设教育强国的重要基础&#xff0c;利用技术和数据助推高校管理转型&#xff0c;从而更好地支撑教学业务开展。 近年来&#xff0c;国家多次发布政策&#xff0c;驱动教育行业的数字化转型。《“十四五”国家信息化规划》&#xff0c;推进信息技术、智能技术与教育…

【JavaEE 初阶】⽹络编程套接字

一、⽹络编程基础 1.应用层 操作系统提供的一组 api >socket api(传输层给应用层提供) 2.传输层 两个核心协议. TCPUDP 差别非常大,编写代码的时候,也是不同的风格 因此, socket api 提供了两套 TCP 有连接, 可靠传输, 面向字节流, 全双工 UDP …

AI大模型驱动数据分析:利用自然语言实现数据查询与可视化(1)

在当今AI驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的能力。然而&#xff0c;传统的数据分析流程通常需要掌握SQL、数据处理和可视化等多项专业技能&#xff0c;这对非技术背景的业务人员来说是一个不小的挑战。 想象一下&#xff0c;当数据中心的负责人打开手机时…

注解方式的AspectJ实现方式

BookService类 package com.hkd.service;public interface BookService {public void buyJava();public int comment();void buy(); }BookServiceImp类 package com.hkd.service;import org.springframework.stereotype.Component;Component("bs") public class Bo…

如何避免数据丢失:服务器恢复与预防策略

在当今数字时代&#xff0c;数据对于个人和企业来说都至关重要。数据丢失可能会导致严重的财务损失、业务中断甚至法律责任。因此&#xff0c;采取措施防止数据丢失至关重要。本文将讨论服务器数据丢失的常见原因以及如何防止数据丢失的有效策略。 服务器数据丢失的常见原因 服…

远程连接服务--Linux中

远程连接服务–Linux中 1. 远程连接服务器简介 1.1 什么是远程连接服务器 ​ 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系…