C++ 離散知識點

摘要

C++ 離散知識點


  • 在不同源文件可define同一個宏(宏作用域爲從#define開始到當前源文件結束)
  • 防止頭文件重複包含指的是:防止某個源文件重複包含同一個頭文件兩次,但是同一個頭文件可以同時被不同源文件各包含一次。
  • 類一般在頭文件中定義,在類內定義的函數默認是內聯(inline)的,而在類內聲明,在類外定義的函數則不默認爲內聯(inline)
  • 頭文件內定義的變量會自動被加上extern
  • 在頭文件裏定義函數的幾種方法:
    • 聲明類,在類中定義靜態成員函數,並在頭文件中實現函數。
    • 使用模板函數(其要求聲明和定義都在頭文件中)(沒有試過)
    • 定義爲內聯函數inline

C++ 語法

  • 負數求餘和商都是負數。例如-123 / 10 = -12-123 % 10 = -3
  • string類型前要加std::
  • 定義std::string a="123456", 那麼a[a.length() - 1] == '6' 而不是'\0'
  • char a = '' 會報錯,因爲不能初始化爲空字符。至少也要是char a = '\0'
  • 注意:棧stack沒有reserve方法。(TODO:C++ prime還是算法設計與分析中似乎有總結哪些結構含有reserve,看一下)
  • 注意vector的size是無符號的。例如vector<int> aa;,當aa.size()爲0時,aa.size()-1不是-1而是一個無符號數的最大值。在所以建議以後i<aa.size()-1寫爲i+1<aa.size()
  • C++中,有符號類型數向右位移有點特殊,向右位移時,最左邊補0還是補1好像得看機器具體實現。若總是補0則稱爲logical shift,若補符號位則稱爲arithmetic shift,目前C++的編譯器似乎都是補符號位(即arithmetic shift),例如 10000000 >> 1 結果爲11000000。除了這種特殊情況,其他時候位移空缺的位都補0。(leetcode的C++編譯器不能對負數右移,不知道爲啥,如-1>>1在運行時會報錯,參考這裏也報錯,要把這個弄清楚,否則後序在線筆試時提交代碼可能會出錯)
  • C++中,有符號數和無符號數在一起進行運算時,首先會將有符號數按照其補碼轉換爲無符號數,再進行運算。(其實可以這麼看,機器不認有無符號,全都按照補碼來進行計算,最後的結果是補碼,按照無符號數的方式解讀。)例:
    short a = -1;
    unsigned b = 1;
    if(a < b) printf("a<b");
    else printf("a>b");
    
    結果是"a>b",因爲a的補碼是全1,被當成無符號數後爲65535,那自然大於b。
  • C++變量未初始化的後果。未初始化的全局變量會自動初始化爲0,未初始化的局部變量一般爲亂碼。參考這裏。當然我覺得具體情況還得看編譯器吧。

C++ 庫函數

  • int isalnum ( int c )頭文件\<ctype\>,檢查一個字符是不是字母或數字(alphanumeric)。
  • int tolower(int c);頭文件\<ctype\>,將一個字符轉換爲小寫字符。

相關/參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章