C++ Primer阅读笔记--语句的使用

2023-11-13

① 空语句

        最简单的语句是空语句,其只含有一个单独的分号;

② switch语句

        case 关键字和它对应的值一起被称为 case 标签,case 标签必须是整型常量表达式;

char ch = getVal();
int iVal = 42;
switch(ch){
    case 3.14: // 错误,case标签不是一个整数
    case ival: // 错误,case标签不是一个常量
    ……
}

③ 范围 for 语句

        C++11 新标准引入了范围 for 语句,其可以遍历容器或其它序列的所有元素;

       expression 表示的必须是一个序列,其可以为用花括号括起来的初始化列表、数组、或 vector 和 string 等类型的对象,这些对象的特点是拥有能返回迭代器的 begin 和 end 成员;

        declaration 定义一个变量,序列中的每个元素都得能转换成该变量的类型,一般使用 auto 类型说明符声明变量;如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型;

for (declaration : expression)
    statement

std::vector<int> v = {0, 1, 2, 3};
for (auto &r : v)
    r *= 2; // 将 v 中所有元素翻倍
// 范围 for 语句与以下传统 for 语句等价
for(auto beg = v.begin(), end = v.end(); beg != end; ++beg){
    auto &r = *beg;
    r *=2;
}
// 因此不能通过范围 for 语句增加 vector 对象的元素,因为范围 for 语句预存了 end() 的值;

④ break 语句和 continue 语句

        break 语句负责终止离它最近的while、do while、for 和 switch 语句,并从这些语句之后的第一条语句开始继续执行;

        continue 语句终止最近的循环中的当前迭代并立即开始下一次迭代,其只能出现在 for、while、do while或嵌套在此类循环里的语句或块的内部;

        break 语句的作用范围仅限于最近的循环或者 switch;出现在嵌套循环中的 continue 语句也仅作用于离它最近的循环;与 break 语句不同的是,只有当 switch 语句嵌套在迭代语句内部时,才能在 switch 里使用 continue 语句;

⑤ goto语句

        goto 语句的作用是从 goto 语句无条件地跳转到同一函数内的另一条语句;一般不建议在程序中使用 goto 语句,因为其能使程序变得难以理解和修改;

goto label;

// label 是用于标识一条语句的标示符,其定义的带标签语句如下:
label : xxxxx;    // xxxx为具体的语句

        goto 语句不能跳过带有初始化变量定义的语句,即下面的代码会出错,因为 goto 语句跳过了 int a = 30 这条带有初始化定义的语句;

// 错误代码如下:
#include "iostream"

int main(int argc, char* argv[]){
    goto label;
    int a = 30;
    std::cout << "a: " << a << std::endl;
    label :
        int b = 50;
        std::cout << "b: " << b << std::endl;

    return 0;
}

// 正确代码如下:
#include "iostream"

int main(int argc, char* argv[]){
    int a = 30;
    goto label;
    std::cout << "a: " << a << std::endl;
    label :
        int b = 50;
        std::cout << "b: " << b << std::endl;

    return 0;
}

⑥ 异常处理机制

        异常处理机制为程序中的异常检测和异常处理这两部分的协作提供支持;在 C++ 语言中,异常处理包括:throw表达式、try语句块和异常类;

        throw 表达式:异常检测部分使用 throw 表达式来表示其遇到的无法处理的问题,一般称为 throw 引发(raise)了异常;

        try 语句块:异常处理部分使用 try 语句块处理异常,其以关键字 try 开始,并以一个或多个 catch 子句结束;try语句块中抛出的异常通常会被某个 catch 子句处理,因此 catch 子句被称为异常处理代码;

        异常类:用于在 throw 表达式和相关的 catch 子句之间传递异常的具体信息;

        throw 表达式包含关键字 throw 和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型;

        抛出异常将终止当前函数,并把控制权转移给能处理该异常的代码;

// 当数据的 ISBN 不相同时,抛出一个 runtime_error 类型的异常对象
if(item1.isbn() != item2.isbn()){
    throw runtime_error("DATA must refer to same ISBN");
}

        try 语句块的通用语法形式如下,即由一个 try 块和一个或多个 catch 子句块组成; catch 子句包括三部分:关键字 catch、括号内一个对象的声明(称为异常声明)、一个块;

        当选中某个 catch 子句处理异常时,会执行与之对应的块;catch 一旦完成,程序跳转到 try 语句块最后一个 catch 子句之后的语句继续执行;

try{
    program-statements
} catch (exception-declaration){
    handler-statements
} catch (exception-declaration){
    handler-statements
}
// 代码实例
#include <iostream>
#include <stdexcept>

int main(int argc, char* argv[]){
    int color;
    std::cin >> color;
    std::cout << "your input is : " << color << std::endl;
    try{
        if (color > 255){
            // 抛出上溢错误
            throw std::overflow_error("上溢"); 
        } 
        else if(color < 0){
            // 抛出下溢错误
            throw std::underflow_error("下溢");
        }
    }
    // 捕获std::overflow_error的错误
    catch(std::overflow_error err1){ 
        color = 255;
    }
    // 捕获std::underflow_error的错误
    catch(std::underflow_error err2){ 
        color = 0;
    }
    std::cout << "Real valid data: " << color << std::endl;

    return 0;
}

         上述代码中,根据不同检测条件抛出了不同的异常,并由对应的 catch 语句进行处理;抛出的异常类型可以采用提供的标准异常,也可以自定义异常类型,上述代码中使用了由头文件 stdexcept 提供的两个标准异常类:std::overflow_error 和 std::underflow_error;

        当异常被抛出时,会搜索能够处理该异常的函数;当未能找到任何匹配的 catch 子句时,程序会调用 terminate 函数来中止程序;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer阅读笔记--语句的使用 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • ethereumjs/ethereumjs-util

    ethereumjs ethereumjs util Most of the string manipulation methods are provided by ethjs util 更多的字符串处理方法可以看ethjs util ad
  • 几个常用的图片处理和图像识别API

    鸟类识别 http www inspirvision cn www product 支持鸟类品种鉴别 不同种类鸟类检测 鸟类数量统计 提供API Camera360 https github com pinguo PGSkinPrettif
  • [ kubernetes ] 基础名词解释

    Service RC RS和Deployment只是保证了支撑服务的微服务Pod的数量 但是没有解决如何访问这些服务的问题 一个Pod只是一个运行服务的实例 随时可能在一个节点上停止 在另一个节点以一个新的IP启动一个新的Pod 因此不能以
  • 跨域性的常识性推理

    跨域性的常识性推理是指在不同领域或知识领域之间进行推理和迁移的能力 它涉及将已有的知识和经验应用于新的情境或领域 以生成新的推理和理解 以下是关于跨域性常识性推理的一些常见观点 基础知识迁移 跨域性常识性推理可以帮助我们将基础知识从一个领域
  • 深度学习的发展方向: 深度强化学习!

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 作者 莫凡 马晶敏 上海交通大学 转载自 Datawhale 深度学习不够智能 强化学习又太抽象 深度强化学习是两套理论体系乘风破浪以后的成团产物 其骨架来自强化学习 而
  • 整理了适合新手的20个Python练手小程序

    100个Python练手小程序 学习python的很好的资料 覆盖了python中的每一部分 可以边学习边练习 更容易掌握python 本文附带基础视频教程 私信回复 基础 就可以获取的 程序1 题目 有1 2 3 4个数字 能组成多少个互
  • 通过poi+java实现Excel表格的列宽度自适应

    新建sheet同时往sheet加入数据后 进行列宽设置 代码如下 固定首行 下拉时实现首行固定不动 sheet createFreezePane 0 1 0 1 列宽自适应 outputList get 0 size 为首行的列数 根据首行
  • web容器与servlet容器的区别

    servlet容器 负责管理servlet生命周期 web容器 负责管理和部署web应用 其本身可能具备servlet容器组件 如果没有 一般能将第三方servlet容器作为组件整合进web容器 1 web容器好比电视机 servlet容器
  • Hibernate(二)——一对多查询

    1 前言 本章节我们讨论Hibernate一对多查询的处理 在上一章节中 Hibernate 一 入门 我们探讨了Hibernate执行最基本的增删改查操作 现在我们将情况复杂化 加入我们在查询用户信息的时候需要同时查询其登录日志 这样就涉
  • 七、MySql-锁与事物

    MySql 锁与事物 锁 锁的简介 为什么需要锁 锁的概念 MySQL 中的锁 表锁与行锁的使用场景 MyISAM 锁 共享读锁 独占写锁 总结 InnoDB 锁 语法 注意 锁的等待问题 事务 什么存储引擎支持事务 事务特性 原子性 at
  • PyQt5接入高德地图搜索API出现Request Failed提示

    PyQt5接入高德地图搜索API出现Request Failed提示 Dcan1994的博客 CSDN博客 pyqt5 加载高德地图 PyQt5接入高德地图搜索功能API Windows版本 10 Python版本 3 6 5 高德地图AP
  • VC怎样调用COM控件的接口函数

    COM库函数 利用COM库函数使用代码组件的方法是本文介绍的三种方法中实现起来最麻烦和困难的方法 它要求开发人员必须具有对COM原理的深入理解 该方法实现步骤如下 1 首先添加COM初始和终止代码 在应用程序类的初始化实例函数InitIns
  • 跨时钟域信号传输(一)——控制信号篇

    1 跨时钟域与亚稳态 跨时钟域通俗地讲 就是模块之间有数据交互 但是模块用的不是同一个时钟进行驱动 如下图所示 左边的模块1由clk1驱动 属于clk1的时钟域 右边的模块2由clk2驱动 属于clk2的时钟域 当clk1比clk2的频率高
  • 线性代数 --- 什么是高斯消元法,什么又是高斯-若尔当消元法?

    高斯 若尔当消元法 写在最前面 我这个人比较喜欢炫耀 尤其发现别人在我面前炫耀的时候 我就会试图用我所学的知识盖过他的锋芒 所以呢 当初在Gilbert string老爷爷的课程里面第一次听到高斯若尔当这个词汇的时候 整个人就炸了 为什么我
  • 【计算机视觉

    文章目录 一 检测相关 11篇 1 1 Benchmarking Anomaly Detection System on various Jetson Edge Devices 1 2 High Performance Fine Defec
  • 双buffer防止 map读写并发

    package main import fmt strconv sync var s 2 map string string current 0 wg sync WaitGroup func w s1 string tmpIndex cur
  • c语言程序书写遵循的规则,C程序书写时应遵循的规则

    在C语言的应用领域 如通讯领域和嵌入式系统领域 一个的软件项目通常包含很多复杂的功能 实现这个项目不是一个程序员单枪匹马可以胜任的 往往需要一个团队的有效合作 另外 在一个以C代码为主的完整的项目中 经常也需要加入一些其他语言的代码 例如
  • 【Jenkins】Jenkins : Mac中Jenkins的停止和启动

    1 美图 2 命令 启动 重启 sudo launchctl load Library LaunchDaemons org jenkins ci plist 停止 sudo launchctl unload Library LaunchDa
  • 【2023】java打印PDF(不需要调用浏览器直接静默打印)

    java打印PDF 不需要调用浏览器直接静默打印 一 简 需求 实现步骤 二 代码实现 0 打印模板 1 服务器部分 端口 8090 1 1 maven依赖 1 2 实体 1 2 1 接口返回类 1 2 2 标签纸页面参数类 1 2 3 P
  • C++ Primer阅读笔记--语句的使用

    空语句 最简单的语句是空语句 其只含有一个单独的分号 switch语句 case 关键字和它对应的值一起被称为 case 标签 case 标签必须是整型常量表达式 char ch getVal int iVal 42 switch ch c