标准C++中的语句分析报告

引言:执行的文法

本报告旨在对标准C++中的语句(Statements)进行一次形式化且详尽的分析。在C++语言体系中,语句是指定一个动作的基本执行单元,它与指定一项计算的表达式(Expression)共同构成了程序的骨架。理解语句的精确定义、分类及其语义是掌握C++程序行为、控制流和资源管理的关键。

本报告的范畴将涵盖对语句的形式化定义,深入剖析语句与表达式的核心区别,并系统性地对C++标准定义的每一种主要语句类型进行分类与阐释。此外,报告还将探讨现代C++标准(如C++11、C++17及后续版本)如何演进和增强语句的功能,并分析不同语句类型如何相互作用以控制程序流程、管理作用域与对象生命周期,以及处理异常条件。

为了给读者提供一个清晰的结构导图,下表首先概述了C++中主要的语句类别及其核心功用。

表1:C++语句类别摘要

类别 关键字/语法 主要目的
表达式语句 expression; 执行表达式的副作用,并丢弃其结果值。
复合语句 {…} 将一组语句组合成一个语法单元,并创建一个新的块作用域。
选择语句 if, switch 根据条件执行不同的代码路径,实现条件分支。
迭代语句 while, for, do-while 重复执行一段代码,实现循环。
跳转语句 break, return, goto, continue 无条件地将控制权转移到程序的另一部分。
声明语句 type identifier; 向程序中引入新的名字(如变量、类型、函数等)。
异常处理语句 try, catch, throw 提供一种处理运行时异常情况的结构化机制。

第1节:语句与表达式的二分法:动作与值

在C++的语法体系中,语句和表达式是两个基本但截然不同的概念。准确理解它们的区别是掌握语言语义的第一步。

1.1 形式化定义与核心原则

表达式(Expression) 根据C++标准的定义,是“一个指定了计算过程的操作符与操作数的序列” 1。每个表达式的核心特性是它会

产生一个值(evaluates to a value),并且具有明确的类型 2。例如,42、x + y以及函数调用func()都是表达式 1。在C++中,赋值操作(如x = 5)和输入/输出操作(如 std::cout << x)也被设计为表达式,它们在完成操作后会返回一个值 3。

语句(Statement) 则被定义为“程序中按顺序执行的片段,用于执行某个确定的动作” 1。语句的主要目的是做事(do something),而不是产生值 5。它们是控制程序执行流程、声明变量或管理资源的基本单位 3。

两者最根本的区别在于:表达式的核心是,而语句的核心是动作效果。一个简单的判别方法是,能够作为函数参数传递的通常是表达式;反之,如果不能,它就是一个语句 5。例如,你不能将一个if {…}块作为参数传递给函数。

1.2 副作用的角色

副作用(Side Effect)指的是对状态的修改,例如改变变量的值、在磁盘上写入数据或在用户界面上显示菜单 1。

虽然表达式的主要目的是计算一个值,但它也可以产生副作用。例如,自增表达式x++在返回x的原始值的同时,也修改了x的状态。同样,赋值表达式y = f(x)在计算出赋值结果的同时,也可能因为函数f内部的操作而修改了全局状态。

与此相对,语句的主要目的就是为了产生副作用。如果一个语句没有任何副作用,那么它通常是无用的 5。这一原则在表达式语句中体现得尤为明显。

1.3 表达式语句与空语句

表达式语句(Expression Statement) 是C++中最常见的语句类型之一。它的语法非常简单:一个可选的表达式后跟一个分号(;)1。在执行时,该表达式被求值,其产生的任何结果都会被丢弃 1。因此,表达式语句的唯一意义在于利用表达式求值过程中产生的副作用 1。典型的例子包括赋值语句

x = 5;和函数调用语句my_func();。一个像x + y;这样的表达式语句在语法上是合法的,但通常是无用的,因为计算出的和被立即丢弃,除非+操作符被重载以产生某种副作用 3。

空语句(Null Statement) 由一个单独的分号(;)构成 3。它不执行任何操作。空语句的主要用途是在语法上需要一个语句但逻辑上不需要任何操作的场合。一个常见的例子是为循环提供一个空的主体,例如在

while (*dest++ = *src++);中,所有的工作都在循环条件中完成了。此外,它还可以用于在复合语句的末尾放置一个标签 4。

C++的设计哲学,尤其是在从C语言继承的特性中,有意地模糊了表达式和语句之间的界限,这与一些在语法上严格区分两者的语言(如Pascal)形成了鲜明对比 3。在Pascal等语言中,赋值是一个纯粹的语句,不产生值。然而,C++将赋值(=)设计成一个运算符,它会产生所赋的值。这一设计决策使得链式赋值(x = y = 5;)和在其他表达式中嵌入赋值成为可能,例如if (x = find_value()) 3。这种设计虽然为底层、命令式编程提供了极大的简洁性和灵活性,但也可能导致代码可读性下降,并引入常见的编程错误(例如,将if (x == 0)误写为if (x = 0))。表达式语句正是弥合这一鸿沟的形式化机制。它允许任何计算值的构造(表达式)被当作一系列动作中的一步(语句)来对待,只要程序员真正关心的是其副作用。这揭示了一种务实而非纯理论的语言设计取向。


第2节:基础语句:声明、作用域与标签

在深入探讨控制流之前,理解构成程序结构基础的语句至关重要。这些语句负责引入标识符、定义作用域和为控制转移提供目标。

2.1 声明语句

声明语句(Declaration Statement)向程序中引入一个或多个名称(标识符),并为其指定类型 1。例如,int x;、const double PI = 3.14159;和class MyClass;都是声明语句 7。

在C++中,声明本身就是一种语句 6。这与C语言早期版本的一个关键区别在于,C++允许声明语句与其它执行语句混合在一起,而不必像C89那样必须将所有声明放在块的开头。这一改进使得变量可以在更接近其首次使用的位置被声明,从而提高了代码的可读性和局部性。

2.2 复合语句(块)

复合语句(Compound Statement),通常称为“块”(Block),是由一对花括号{…}括起来的零个或多个语句的序列 1。

从语法角度看,一个复合语句被视为一个单一的语句。这使得在语法上只允许单个语句的地方(例如if或for循环的主体)可以使用多条语句 4。

从语义角度看,复合语句引入了一个新的块作用域(Block Scope)。在块内声明的变量(具有自动存储期的对象)在程序执行进入该块时被创建,在退出该块时,它们会以与声明相反的顺序被销毁 4。

复合语句虽然在语法上只是简单的语句分组,但它在C++中扮演着至关重要的结构性角色。它的作用远不止于此,它是C++确定性对象生命周期管理以及“资源获取即初始化”(Resource Acquisition Is Initialization, RAII)这一核心编程范式的基石。RAII是编写安全、健壮的C++代码的核心技术。其实现逻辑如下:首先,一个复合语句定义了一个作用域 4。其次,具有自动存储期的对象(即栈上的变量)的生命周期与该作用域绑定,当控制流离开作用域时,这些对象的析构函数会被确定性地调用 4。RAII范式正是利用了这一点:在对象的构造函数中获取资源(如文件句柄、互斥锁、动态内存),并在其析构函数中释放资源。通过在复合语句中声明这样一个RAII对象,其生命周期就被严格限制在该块内。无论控制流如何离开这个块——无论是正常执行完毕、通过

return或break跳出,还是因为抛出了异常——资源的释放都得到保证。这巧妙地将{…}这一简单的语法结构与异常安全(将在第6节讨论)等高级主题联系起来。没有复合语句所提供的明确的生命周期语义,RAII将无从谈起,C++也将失去其最强大的资源管理机制。

2.3 标签语句

标签语句(Labeled Statement)允许在任何语句前放置一个标签,标签是一个标识符后跟一个冒号,例如my_label: statement; 4。

标签的主要功能是作为goto语句的跳转目标。通过标签和goto,程序可以实现非结构化的控制转移。此外,还有两种特殊的标签:case标签和default标签,它们只能在switch语句的上下文中使用,用于标记多路分支的目标 4。


第3节:迭代语句:控制重复执行

迭代语句,即循环,是程序设计中用于重复执行特定代码块的基本工具。C++提供了多种循环结构,以适应不同的迭代需求。

3.1 前测试与后测试循环

while循环 的语法是while (condition) statement; 4。在每次迭代开始之前,都会对condition进行求值。只有当条件为真时,statement才会被执行。因此,while循环体可能一次也不执行(执行零次或多次)8。

do-while循环 的语法是do statement while (condition); 4。与while循环不同,do-while循环首先执行一次statement,然后再对condition进行求值。只要条件为真,循环就会继续。这意味着do-while循环体至少会执行一次 8。这种特性在某些场景下非常有用,例如,当需要确保循环体至少执行一次时,比如在机器人应用中首次读取传感器数据 11。

3.2 C风格for循环

C风格的for循环提供了一种更结构化的循环控制方式,其语法为:for (init-statement; condition; expression) statement; 4。

它的执行机制如下 8:

  1. 执行一次init-statement。这通常用于声明和初始化一个循环控制变量。
  2. 对condition进行求值。
  3. 如果condition为真,则执行statement。
  4. 执行expression,这通常用于更新循环控制变量(例如,自增)。
  5. 跳转回第2步,重复此过程。

init-statement部分可以是一个声明,在这种情况下,所声明变量的作用域被严格限制在for循环内部。这是在C++17的if带初始化器出现之前,一种早已存在的、用于控制作用域的有效方式。

3.3 C++11 基于范围的for循环

C++11引入了基于范围的for循环(Range-Based for Loop),极大地简化了对序列的遍历。其语法为:for (range-declaration : range-expression) statement; 4。

它的主要目的是简化对一个范围(range)的迭代,这个范围可以是数组、STL容器(如std::vector),或任何提供了begin()和end()成员函数或非成员函数的对象 12。

关于range-declaration的最佳实践如下 12:

  • for (auto x : range):为范围中的每个元素创建一个副本。这通常是低效的,并且在需要修改原始元素时是错误的,因此“几乎总是不可取的”。
  • for (const auto& x : range):通过常量引用访问元素。这是只读访问的首选形式,因为它避免了不必要的拷贝开销,并能防止意外修改元素。
  • for (auto& x : range):通过引用访问元素。当需要修改范围内的元素时,这是首选形式。

C++中循环语句的演进,特别是从C风格for循环到基于范围的for循环的转变,深刻地反映了语言设计理念的变迁:从命令式的、易错的手动控制,转向声明式的、更抽象、更安全的编程风格。C风格for循环要求程序员手动管理三个独立的部分:初始化、条件检查和迭代推进 8。这是“差一错误”(off-by-one errors)和其他逻辑错误的常见来源。相比之下,基于范围的for循环将所有这些底层机制都抽象掉了 12。程序员不再需要指定

如何迭代,而只需声明其意图:对序列中的每个元素执行操作。这种转变不仅减轻了程序员的认知负担,消除了整整一类常见错误,还使代码的意图更加清晰,直接支持了C++核心准则中的“表达意图”原则。此外,它将迭代逻辑与具体的容器类型解耦,同样的语法适用于std::vector、std::list、原生数组以及任何符合begin()/end()接口的用户定义类型,从而促进了泛型编程,提高了代码的可维护性。这一演进正是现代C++哲学的一个缩影。


第4节:选择语句:条件执行路径

选择语句允许程序根据特定条件的值来选择不同的执行路径。

4.1 if-else语句

if-else语句是实现条件分支最基本的结构。其语法为if (condition) statement1;或if (condition) statement1; else statement2; 4。

程序会对condition进行求值。如果结果为true,则执行statement1;否则,如果存在else子句,则执行statement2 9。

condition可以是任何可以转换为bool类型的表达式。在转换时,非零的数值或非空的指针会被转换为true,而零值或空指针则转换为false。

4.2 switch语句

switch语句提供了一种基于单个值进行多路分支的方式。其语法为switch (condition) statement;,其中statement通常是一个包含多个case和default标签的复合语句 4。

condition的值必须是整数类型、枚举类型或可以转换为这些类型的类类型。执行时,程序会跳转到与condition值匹配的case标签处。switch语句一个著名且独特的特性是“贯穿”(fall-through):在执行完一个case分支的代码后,控制流会继续执行下一个case分支,除非遇到break语句来显式地跳出switch结构。这种行为虽然强大,但也常常是错误的来源,尤其是当程序员意外遗漏break时。

4.3 C++17增强功能:带初始化器的if和switch

C++17标准引入了一项重要改进,允许在if和switch语句中直接包含一个初始化器。

语法分别为if (initializer; condition)…和switch (initializer; variable)… 14。

目的是允许一个变量在if或switch语句的控制结构内部被声明和初始化。

这项新特性的主要优点在于,在initializer中声明的变量的作用域被严格限制在该if-else或switch块之内 14。这可以有效防止变量“泄漏”到外部作用域中,从而提高了代码的封装性,并允许在不同上下文中安全地重用相同的变量名 14。这个特性对于RAII对象尤其有用,例如,可以优雅地处理

std::lock_guard的生命周期管理 15。

C++17的带初始化器的if语句,是语言演进为RAII范式提供更细粒度语法支持的直接体现,它优雅地解决了一个常见的代码“坏味道”。在C++17之前,一个常见的模式是获取资源,检查其状态,然后使用它:auto result = get_resource(); if (result.is_valid()) {… }。在这种模式下,变量result在if块结束后仍然存在于作用域中,即使它可能不再被需要 14。为了限制其作用域,开发者不得不引入一个额外的代码块:

{ auto result = get_resource(); if (result.is_valid()) {… } },但这在语法上显得有些笨拙 15。C++17的新语法if (auto result = get_resource(); result.is_valid()) {… }以更简洁、意图更明确的方式实现了相同的作用域限制 15。这种语法在处理RAII类型时尤其强大。考虑if (std::lock_guard lock(mtx);!shared_data.empty()) {… }:互斥锁被获取,条件被检查,然后在if/else作用域结束时,锁被自动释放。因此,这个特性不仅仅是关于作用域控制,更是关于将资源的获取和生命周期与需要它的特定条件逻辑紧密绑定,从而使RAII的应用更加符合人体工程学,并鼓励更安全的代码实践。


第5节:跳转语句:无条件控制转移

跳转语句用于无条件地将程序的控制权从一点转移到另一点。虽然强大的控制流工具,但某些跳转语句(特别是goto)的使用需要非常谨慎。

5.1 局部跳转:break和continue

break语句 用于立即终止其所在的最内层的switch或迭代语句的执行 4。控制权将转移到被终止语句之后的第一条语句。

continue语句 用于跳过其所在的最内层迭代语句的当前迭代的剩余部分,并立即开始下一次迭代 4。在

for循环中,continue会跳转到循环的更新表达式部分;在while和do-while循环中,它会跳转到条件测试部分。

5.2 函数终止:return语句

return语句用于终止当前函数的执行,并将控制权交还给调用者 4。

return语句可以带一个可选的返回值。对于有返回值的函数,return语句必须提供一个与函数声明的返回类型兼容的值。从C++11开始,也可以使用花括号初始化列表(braced-init-list)进行返回 4。对于声明为void的函数,return语句不能返回值,但return;可以用于提前退出函数。

5.3 goto语句

goto语句的语法是goto label;,它将控制权无条件地转移到当前函数内由label标识的语句处 4。

争议:goto语句是编程语言中最具争议的特性之一。Edsger Dijkstra在1968年发表的著名论文《Go To Statement Considered Harmful》中对其进行了严厉批评,认为它允许创建非结构化的、“面条式代码”(spaghetti code),这种代码的逻辑流程难以静态分析、理解和维护 18。

在C++中的限制:C++对goto的使用施加了一些限制。例如,goto不能跳过一个变量的初始化,如果该变量在跳转目标点处于作用域内。此外,goto只能在当前函数内部进行跳转。

合理的用例:尽管通常不鼓励使用goto,但在现代C++编程中,它仍然存在一些被接受的、非常有限的用例:

  • 跳出深度嵌套的循环:当需要从多层嵌套循环中直接退出时,使用goto可能比设置多个布尔标志并通过多层break来退出更清晰、更直接 18。
  • 集中的清理/错误处理:在函数的末尾实现一个公共的清理代码块,当函数在多个地方检测到错误时,可以通过goto跳转到这个清理块。这种模式在C代码中更为常见 18。

关于goto的争议突显了语言设计中表达能力与结构化安全性之间的根本性张力。Dijkstra的核心论点是,goto破坏了结构化编程块的“单入口,单出口”原则,使得程序的控制流难以静态追踪 18。然而,现代C++虽然为几乎所有场景提供了更优越的结构化替代方案(如return、break、异常和RAII),但仍然保留了goto。这承认了在极少数复杂的控制流场景中,直接跳转可能是最直接的实现方式。例如,要退出一个三层嵌套的循环,结构化的方法可能需要一个布尔标志,并在每一层循环中进行检查,代码会显得冗长。而使用goto则可以一步到位,在这种特定情况下,goto的代码可能更具可读性 18。C++的解决方案不是禁止

goto,而是通过提供更好的工具使其在99%的情况下都变得不必要。例如,可以将嵌套循环重构为一个函数,然后使用return来处理退出条件。因此,在现代C++中,goto不应被视为日常工具,而是一个用于处理特殊控制流情况的底层原语,其“危害性”已被语言对结构化替代方案和基于RAII的清理机制的强烈偏好所大大缓解。


第6节:异常处理:非局部控制转移机制

异常处理是C++中一种强大且结构化的错误处理机制,它允许程序在检测到异常情况时,将控制权以非局部的方式转移到专门的处理代码。

6.1 保护代码与信号-捕获:try、throw和catch

C++的异常处理机制由三个关键字协同工作:

  • try块:一个复合语句,用于包围可能会抛出异常的代码 4。这部分代码被称为“受保护的”(guarded)代码段。
  • throw表达式:当程序检测到异常情况(通常是错误)时,使用throw表达式来“抛出”一个异常 19。
    throw会中断当前的执行流程,并将控制权转移到最近的能够处理该异常的处理器。理论上任何类型的对象都可以被抛出,但最佳实践是抛出一个派生自std::exception的类的对象 19。
  • catch块:异常处理器。它必须紧跟在try块之后,并指定它能够处理的异常类型 19。当一个异常被抛出时,系统会按顺序检查与该
    try块关联的catch块,直到找到一个类型匹配的处理器。

6.2 栈展开、对象析构与RAII

当一个异常被抛出时,运行时系统会沿着函数调用栈向上传播,寻找一个匹配的catch块。这个过程被称为栈展开(Stack Unwinding)21。

在栈展开的过程中,一个至关重要的、被语言标准所保证的行为是:当每个栈帧(stack frame)退出时,在该作用域内所有已完全构造的自动存储期(即栈上)对象的析构函数都会被依次调用 21。

正是这个机制使得RAII范式能够提供强大的异常安全性。由RAII对象管理的资源(如内存、文件、锁等)会在栈展开过程中被自动、确定性地释放,从而有效防止资源泄漏,即使在复杂的错误路径中也是如此。

6.3 高级主题

  • 重新抛出:在catch块内部,使用不带操作数的throw;语句可以重新抛出当前正在处理的原始异常对象 19。这样做可以保留异常对象的完整多态类型信息,非常适合于需要对异常进行部分处理(如记录日志)后再将其传递给更高层的处理器。
  • 捕获所有异常:catch(…)块可以捕获任何类型的异常 20。它应该作为
    try-catch序列中的最后一个处理器。使用它需要非常谨慎,因为它无法获知所捕获异常的具体类型。通常,它被用于执行最终的清理工作、记录未知错误,然后终止程序 19。
  • 最佳实践:推荐的实践是按值抛出,按常量引用捕获(catch (const std::exception& e))19。这样做可以避免不必要的对象拷贝和潜在的对象“切片”(slicing)问题,后者在处理多态异常层次结构时尤其重要。
  • noexcept:C++11引入的noexcept说明符用于向编译器和程序员表明一个函数保证不会抛出任何异常。这使得编译器可以进行某些优化,例如在移动操作中,如果移动构造函数是noexcept的,容器可能会采用更高效的策略。

C++的异常处理机制本质上是一种控制流机制,而不仅仅是错误处理。它通过栈展开和RAII与对象生命周期的深度集成,使其成为编写健壮、资源安全代码的强大工具,这使其与基于错误码的简单错误处理系统有着本质的区别。传统的错误码机制要求调用者在每次函数调用后显式检查返回值,这很容易被遗忘,导致错误被静默地忽略 24。相比之下,一个未被处理的C++异常默认会调用std::terminate来终止程序 21,这种“快速失败”的行为迫使程序员必须正视并处理错误条件。其关键区别在于栈展开 21。当throw发生时,控制权不是简单地返回给调用者,而是沿着调用栈向上跳跃,可能跨越多个函数边界,直到找到一个处理器。最重要的是,在跳跃的过程中,它通过调用析构函数来清理栈上的资源。这种自动化的清理是返回错误码无法提供的。一个返回错误码的函数必须在返回前手动释放其所有已获取的资源,这在复杂的逻辑中极易出错。因此,try/catch语句和throw表达式构成了一个完整的、带有保证性资源清理的非局部控制转移系统(前提是遵循RAII范式)。它干净地将错误检测逻辑(在throw点)与错误处理逻辑(在catch点)分离开来,即使两者相隔多个函数调用 21。这种分离是稳健系统设计的标志。

结论

对标准C++中语句的分析揭示了该语言设计哲学的核心原则:提供从底层硬件控制到高层抽象的无缝过渡。语句作为执行的基本单元,其演进和多样性反映了C++从一种“带类的C”语言向现代、安全、表达力丰富的多范式语言的转变。

  1. 语法与语义的深度融合:C++的语句设计不仅仅是语法的堆砌。复合语句的块作用域规则直接支撑了RAII这一核心资源管理范式,将对象生命周期与代码结构紧密绑定。同样,异常处理机制通过栈展开与对象析构的确定性结合,提供了一种远超传统错误码的、具有资源安全保证的控制流模型。这些例子表明,在C++中,理解一个语句的全部含义需要同时考虑其语法形式和其对程序状态、对象生命周期的深远影响。
  2. 从命令式到声明式的演进:通过比较C风格的for循环和C++11的基于范围的for循环,我们可以清晰地看到一种设计趋势:语言正在引导开发者从关注“如何做”(手动管理索引、边界和步进)转向关注“做什么”(对序列中的每个元素执行操作)。同样,C++17中带初始化器的if和switch语句,通过将变量的生命周期与使用它的特定逻辑块绑定,减少了认知负担并提高了代码的局部性和安全性。这种演进趋势旨在减少常见错误,提升代码的可读性和意图的明确性。
  3. 务实主义与表达能力的平衡:C++保留了像goto这样充满争议的底层工具,同时提供了丰富的结构化控制流语句,这体现了其设计的务实性。语言设计者承认,尽管结构化编程是常态,但在极少数情况下,直接的、非结构化的跳转可能是最清晰的解决方案。C++的选择不是禁止这种能力,而是提供足够优秀的替代方案,使其变得几乎非必要。

综上所述,C++中的语句是一个复杂而精密的系统。它们不仅定义了程序的执行顺序,还与类型系统、对象模型和资源管理紧密相连。对任何希望精通C++的开发者而言,深入理解每一种语句的语法、语义及其在现代C++编程实践中的最佳应用,是构建高效、健壮和可维护软件的基石。

引用的著作
  1. what’s an expression and expression statement in c++? - Stack Overflow, 访问时间为 九月 23, 2025, https://stackoverflow.com/questions/7479946/whats-an-expression-and-expression-statement-in-c
  2. Expressions - cppreference.com - C++ Reference, 访问时间为 九月 23, 2025, https://en.cppreference.com/w/cpp/language/expressions.html
  3. C++ Basics - 1.4 Expressions and Statements - InformIT, 访问时间为 九月 23, 2025, https://www.informit.com/articles/article.aspx?p=2472079&seqNum=4
  4. Statements - cppreference.com, 访问时间为 九月 23, 2025, https://en.cppreference.com/w/cpp/language/statements.html
  5. Expressions vs Statements | Lambda the Ultimate, 访问时间为 九月 23, 2025, http://lambda-the-ultimate.org/node/1044
  6. language agnostic - Expression versus Statement - Stack Overflow, 访问时间为 九月 23, 2025, https://stackoverflow.com/questions/19132/expression-versus-statement
  7. Expression vs Statement : r/cpp_questions - Reddit, 访问时间为 九月 23, 2025, https://www.reddit.com/r/cpp_questions/comments/plg8ij/expression_vs_statement/
  8. Statements and flow control - C++, 访问时间为 九月 23, 2025, https://cplusplus.com/doc/tutorial/control/
  9. Control flow — On C++, 访问时间为 九月 23, 2025, http://oberon00.github.io/cpptutorial/proc/control-flow.html
  10. C++ from the beginning - control flow - DEV Community, 访问时间为 九月 23, 2025, https://dev.to/azure/c-from-the-beginning-control-flow-21jg
  11. How to Use Operators and Control Flow in C++ - YouTube, 访问时间为 九月 23, 2025, https://www.youtube.com/watch?v=02PdHb2xfKE
  12. Range-based for Statement (C++) | Microsoft Learn, 访问时间为 九月 23, 2025, https://learn.microsoft.com/en-us/cpp/cpp/range-based-for-statement-cpp?view=msvc-170
  13. Control flow statements in Programming - GeeksforGeeks, 访问时间为 九月 23, 2025, https://www.geeksforgeeks.org/computer-science-fundamentals/control-flow-statements-in-programming/
  14. C++17 new feature : If Else and Switch Statements with initializers …, 访问时间为 九月 23, 2025, https://www.geeksforgeeks.org/cpp/c17-new-feature-else-switch-statements-initializers/
  15. C++ 17: IF and SWITCH With Initialisation, 访问时间为 九月 23, 2025, https://www.aloneguid.uk/posts/2021/12/if-with-initialisation/
  16. C++17 If statement with initializer : r/cpp - Reddit, 访问时间为 九月 23, 2025, https://www.reddit.com/r/cpp/comments/4z155b/c17_if_statement_with_initializer/
  17. Taking into account that “If statement with initializer” got in the c++17 standard, why is a initializer list not supported? - Stack Overflow, 访问时间为 九月 23, 2025, https://stackoverflow.com/questions/60692726/taking-into-account-that-if-statement-with-initializer-got-in-the-c17-standa
  18. language agnostic - GOTO still considered harmful? - Stack Overflow, 访问时间为 九月 23, 2025, https://stackoverflow.com/questions/46586/goto-still-considered-harmful
  19. try, throw, and catch Statements (C++) | Microsoft Learn, 访问时间为 九月 23, 2025, https://learn.microsoft.com/en-us/cpp/cpp/try-throw-and-catch-statements-cpp?view=msvc-170
  20. Exceptions - C++, 访问时间为 九月 23, 2025, https://cplusplus.com/doc/tutorial/exceptions/
  21. Modern C++ best practices for exceptions and error handling | Microsoft Learn, 访问时间为 九月 23, 2025, https://learn.microsoft.com/en-us/cpp/cpp/errors-and-exception-handling-modern-cpp?view=msvc-170
  22. Exception Handling in C++ - GeeksforGeeks, 访问时间为 九月 23, 2025, https://www.geeksforgeeks.org/cpp/exception-handling-c/
  23. C++ catching all exceptions - Stack Overflow, 访问时间为 九月 23, 2025, https://stackoverflow.com/questions/315948/c-catching-all-exceptions
  24. ELI5: what is really the exception handling? More exactly what are the try and catch ? And why are they used? - Reddit, 访问时间为 九月 23, 2025, https://www.reddit.com/r/cpp_questions/comments/hh9y0u/eli5_what_is_really_the_exception_handling_more/
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐