C++Primer学习笔记:第5章 语句

  • 一个表达式末尾加上分号就变成了表达式语句。最简单的语句是空语句(一个单独的分号):语法上需要一条语句但是逻辑上不需要

  • 复合语句是指用花括号括起来的(可能为空)语句和声明的序列:用在语法上需要一条语句,但是逻辑上需要多条语句的地方

  • C++规定在同一个语句块中else与离他最近的if匹配

  • case标签必须是整形常量表达式,如果某个case标签匹配成功,将从该标签开始往后顺序执行所有的case分支,除非程序显式中断,标签不应该孤零零地出现,它后面必须跟一条语句或者另外一个case标签

  • C++规定:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。这就要求我们在case语句中不能对变量进行初始化操作(可以进行定义,定义是在编译时期发生的,所以无论如何都无法跳过,但是初始化是可以跳过的,但是这种操作是不被允许的)。

    case true:string file_name;		//错误:控制流绕过一个隐式初始化的变量int i = 0;				//错误:控制流绕过一个显式初始化的变量int j;					//正确:没有初始化break;
    case false:j = 1;					//正确:j已经定义,这里是赋值break;
    

    如果我们想要在case语句中定义并初始化一个变量,应该把变量定义在块内,从而确保后面所有的case标签都在变量的作用域之外

    case true:{string file_name;	//正确:隐式初始化//...}break;
    case false:{//...}
    
  • 条件部分可以是一个表达式或者是一个带初始化的变量声明

  • 定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程

  • 使用while

    • 不确定要迭代多少次
    • 想在循环结束后访问循环控制变量
  • 传统for (initializer; condition; expression) statement循环执行流程:initializer->condition->statement->expression->condition->statement->expression...

    • initializer中可以定义多个变量,但只能有一个声明语句
  • 范围for语句:

    for (declaration : expression)statement
    

    expression必须是一个序列,比如:用花括号括起来的初始值列表、数组、vectorstring,共同特点是有可以返回迭代其的beginend成员

    • 不能通过范围for循环增加vector对象的元素
  • do statement while (condition)语句应该在括号包围起来的条件后用一个分号表示语句结束

    • condition使用的变量必须定义在循环体之外
  • goto语句的作用:从goto语句无条件跳转到同一函数内的另一条语句,语法形式为:

    goto label;
    

    label用于标识一条语句的标示符

    label: statement;
    

    标签标示符独立于变量或其他标示符的名字,因此标签标示符可以和程序中其他实体的标示符使用同一个名字而不会相互干扰。

    switch语句类似,goto语句也不能将程序从控制权从变量的作用域之外转移到作用域之内。向后跳过一个已经执行的定义是合法的(跳到变量定义之前意味着系统将销毁该变量然后重新创建)。感觉比较复杂也没有关系,反正不用

  • C++异常处理机制为程序中异常检测和异常处理两部分

    • throw表达式表示遇到了无法处理的问题,我们说throw引发了异常。例如:

      throw runtime_error("Data error");
      

      该异常的类型是runtime_error对象,抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码

      类型runtime_error是标准库异常类型中的一种,定义在stdexcept头文件中

    • try语句块的通用语法形式:

      try {statement
      } catch (exception-delaration) {handler-statement
      } ...
      

      try语句块内部声明的变量在块外无法访问,特别是在catch子句内也无法访问

      **如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。**该函数的行为与系统有关,一般情况下执行该函数将导致程序非正常退出。

      while (cin >> item1 >> item2) {try {//} catch (runtime_error err) {cout << err.what() << endl;}
      }
      
  • 编写异常安全的代码非常困难

    • exception头文件定义了最通用的异常类exception,只报告异常的发生,只能以默认初始化的方式初始化
    • stdexcept头文件定义了几种常用的异常类(详见P176表5.1),必须提供string对象或者C风格字符串初始化这些类型的对象
    • new头文件定义了bad_alloc异常类型,只能以默认初始化的方式初始化
    • type_info头文件定义了bad_cast异常类型,只能以默认初始化的方式初始化
    • 异常类型的what函数返回一个C风格字符串

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

z3 C++学习笔记

因为项目需要使用z3库来解决问题&#xff0c;所以自己学习了一下&#xff0c;结果发现网上教程比较少&#xff0c;而且大部分都是使用Python&#xff0c;而我本人是C的忠实信徒&#xff0c;在知道C也可以使用z3库以后我毫不犹豫地着手用C使用z3&#xff0c;但是我很快发现&…

C++Primer学习笔记:第6章 函数

通过调用运算符()调用函数 函数的调用完成两项工作&#xff1a; 用实参初始化函数对应的形参将控制权转移给被调用函数&#xff1a;主调函数的执行被暂时中断&#xff0c;被调函数开始执行 尽管实参与形参存在对应关系&#xff0c;但是并没有规定实参的求值顺序。编译器能以任…

C++Primer学习笔记:第8章 IO库

C语言不直接处理输入输出&#xff0c;而是通过一族定义在标准库中的类型来处理IO iostream定义了用于读写流的基本类型fstream定义了读写命名文件的类型sstream定义了读写内存string对象的类型 标准库使得我们能够忽略这些不同类型的流之间的差异&#xff0c;是通过继承机制实…

C++Primer学习笔记:第7章 类

类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术 在类中&#xff0c;由类的设计者负责考虑类的实现过程&#xff0c;使用该类的程序员只需要抽象地思考类型做了什么&#xff0c;而无须了解…

每日一题:leetcode191.位1的个数

题目描述 题目分析 很自然地想到了二进制枚举&#xff0c;直接循环检查每一个二进制位。 class Solution { public:int hammingWeight(uint32_t n) {int ret 0;uint32_t t 1;for (int i 0; i < 32; i, t << 1) {if (n & t) {ret;}}return ret;} };AC之后看了…

每日一题:leetcode341.扁平化嵌套列表迭代器

题目描述 题目分析 这个题目自己大概花了一个小时&#xff0c;虽然是一遍AC&#xff0c;但是速度有点慢&#xff0c;太长时间不写代码导致自己对代码不太敏感&#xff0c;写起来慢腾腾的。 看到这个的想法就是&#xff0c;要用栈来保存列表的迭代器&#xff0c;这样将孩子列表…

每日一题:leetcode82. 删除排序链表中的重复元素 II

题目描述 题目分析 这才是正常的中等题难度嘛&#xff0c;昨天的中等题题解我半天看不懂。。。 首先&#xff0c;需要增加一个哑节点&#xff08;操作链表的常规操作&#xff09;&#xff0c;因为有可能删除首节点&#xff0c;我们不想要为首节点添加单独的逻辑。其次&#xf…

每日一题:leetcode456.132模式

题目描述 题目分析 我觉得这道题应该是我做过最难的中等题之一了&#xff0c;这是昨天的每日一题&#xff0c;但是昨天用nlogn的做法做出来以后在看题解&#xff0c;发现有些看不懂&#xff08;觉得题解有点故弄玄虚&#xff09;。然后今天中午又花了一点时间才搞懂&#xff0…

leetcode283.移动零

题目描述 题目分析 在写简单题放松&#xff0c;看到这道题第一个想法是用STL库函数&#xff0c;虽然知道大概要用双指针之类的&#xff0c;但是库函数爽哇。 class Solution { public:void moveZeroes(vector<int>& nums) {stable_sort(nums.begin(), nums.end(), …

每日一题:leetcode61.旋转链表

题目描述 题目分析 很容易发现&#xff0c;如果k是n的整数倍&#xff0c;相当于没有移动。这样直接对k%n使得k在一个可以接受的范围。 因为是顺序移动&#xff0c;各元素之间的相对位置保持不变&#xff0c;所以就想着将链表先变成一个环。然后再移动头指针&#xff0c;最后再…

每日一题:leetcode173.二叉搜索树迭代器

题目描述 题目分析 更加地觉得编程重要的不在于如何写代码&#xff0c;用什么具体的技巧&#xff0c;编码本身只是一种将思维呈现的方式&#xff0c;但是如果思维是不清晰的&#xff0c;那么就算懂得再多的编码的奇技淫巧也是没有什么帮助的。相反&#xff0c;如果有一个清晰的…

Ubuntu20.04 Clion/Pycharm/IDEA 输入中文+光标跟随解决方案

ibus输入法&#xff08;弃用&#xff09; 之前一直用的搜狗输入法&#xff0c;但是搜狗输入法无法在Jetbrains全家桶下使用&#xff0c;但是又需要输入中文&#xff0c;没有办法我只能下载了谷歌输入法&#xff0c;十分难用&#xff0c;但是也没有其他办法&#xff0c;经常到网…

leetcode11.盛最多水的容器

题目描述 题目分析 看到题目后第一个想法当然是O(n2)O(n^2)O(n2)的&#xff0c;但是数据范围是3e4&#xff0c;应该会超时&#xff0c;而且这种数据范围也不是让暴力求解的 。 相当于求解∑i<jmax((j−i)∗min(a[i],a[j]))\sum_{i<j}{max((j-i)*min(a[i],a[j]))}∑i<…

每日一题:leetcode190.颠倒二进制位

题目描述 题目分析 题目本身很简单&#xff0c;没觉得有什么技巧可以再进行优化了&#xff0c;觉得位运算是无法打乱相对顺序的&#xff0c;而这里需要进行镜像颠倒的操作。因此就踏实地写了一个循环。 在使用位运算得到每一位的时候&#xff0c;我吸取了经验&#xff0c;用一…

结构屈曲分析

结构屈曲分析主要用于判定结构受载后是否有失稳风险&#xff0c;作为工程应用&#xff0c;一般分为线性屈曲分析和非线性屈曲分析。 线性屈曲分析需要具备较多的前提条件&#xff0c;如载荷无偏心、材料无缺陷等&#xff0c;在实际工程应用中结构制作过程和加载方式很难达到线性…

每日一题:leetcode74.搜索二维矩阵

题目描述 题目分析 感觉这是一个放错标签的简单题。题目非常简单&#xff0c;思路应该很明确是二分&#xff0c;我很快写了一个&#xff08;虽然不小心把!打成调试了一会&#xff09;。 class Solution { public:bool searchMatrix(vector<vector<int>>& mat…

每日一题:leetcode90.子集贰

题目描述 题目分析 感觉这道题让自己对枚举排列有了一个更好的认识&#xff0c;感觉自己的这种思路不错。 假设没有重复元素&#xff08;退化成78.子集&#xff09;&#xff0c;我们应该怎么做&#xff1f;初始的时候幂集中只有一个空集&#xff0c;然后对每个元素&#xff0…

每日一题:leetcode1006.笨阶乘

题目描述 题目分析 因为顺序一定且没有括号&#xff0c;所以逻辑很简单。我们要顺序处理的矛盾在于&#xff0c;减号后面会再出现乘法和除法&#xff0c;我们不妨将对乘法和除法用一个临时值进行计算&#xff0c;计算结束后再合并到值里面&#xff0c;一般来讲乘法和除法的处理…

每日一题:leetcode80.删除有序数组中的重复元素贰

题目描述 题目分析 又是一道贴错标签的简单题&#xff0c;很明显的双指针&#xff0c;我的做法是用两个变量保存是否需要记录&#xff0c;官方题解的做法是直接判断&#xff0c;人家的高明一些 class Solution { public:int removeDuplicates(vector<int>& nums) {…

每日一题:leetcode81.搜索旋转排序数组Ⅱ

题目描述 题目分析 不含重复元素的题解&#xff08;leetcode33&#xff09; 这道题也是我们算法课的一道编程题&#xff0c;写完以后发现当时的思路和现在没有什么变化&#xff0c;果然是自己啊。我的想法是先判断区间整体是升序的还是旋转的&#xff0c;如果是升序的就按照正…