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.pswp.cn/news/383567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383567.shtml
英文地址,請注明出處:http://en.pswp.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;如果是升序的就按照正…