C C 學習筆記 基礎知識3

2021-06-23 07:05:00 字數 4017 閱讀 1599

1&&和&、||和|有什麼區別

(1)&和|對運算元進行求值運算,&&和||只是判斷邏輯關係。 

(2)&&和||在在判斷左側運算元就能確定結果的情況下就不再對右側運算元求值。

注意:在程式設計的時候有些時候將&&或|| 替換成&或|沒有出錯,但是其邏輯是錯誤的,可能會導致不可預想的後果(比如當兩個運算元乙個是 1 另乙個是 2 時)。

2程式設計規範

程式設計規範可總結為:程式的可行性,可讀性、可移植性以及可測試性。

3c++的引用和 c 語言的指標有什麼區別

指標和引用主要有以下區別:

(1)引用必須被初始化,但是不分配儲存空間。指標不宣告時初始化,在初始化的時候需要分配儲存空間。

(2)引用初始化以後不能被改變,指標可以改變所指的物件。

(3)不存在指向空值的引用,但是存在指向空值的指標。

注意:引用作為函式引數時,會引發一定的問題,因為讓引用作引數,目的就是想改變這個引用所指向位址的內容,而函式呼叫時傳入的是實參,看不出函式的引數是正常變數,還是引用,因此可能會引發錯誤。所以使用時一定要小心謹慎。

4   寫乙個「標準」巨集 min

這個巨集輸入兩個引數並且返回較小的乙個:

#define min(a,b)((a)<=(b)?(a):(b))

注意:在呼叫時一定要注意這個巨集定義的***,如下呼叫: 

((++*p)<=(x)?(++*p):(x)

p 指標就自加了兩次,違背了 min 的本意。

5typedef 和 define 有什麼區別

(1)用法不同:typedef 用來定義一種資料型別的別名,增強程式的可讀性。define 主要用來定義常量,以及書寫複雜使用頻繁的巨集。

(2)執行時間不同:typedef 是編譯過程的一部分,有型別檢查的功能。define 是巨集定義,是預編譯的部分,其發生在編譯之前,只是簡單的進行字串的替換,不進行型別的檢查。

(3)作用域不同:typedef 有作用域限定。define 不受作用域約束,只要是在 define 宣告後的引用都是正確的。

(4)對指標的操作不同:t ypedef 和 define 定義的指標時有很大的區別。

注意:typedef 定義是語句,因為句尾要加上分號。而 define 不是語句,千萬不能在句尾加分號。

6關鍵字 const     static      extern

說明:const 修飾函式引數,是一種程式設計規範的要求,便於閱讀,一看即知這個引數不能被改變,實現時不易出錯。

(2)static 在 c 中主要用於定義全域性靜態變數、定義區域性靜態變數、定義靜態函式。在 c++中新增了兩種作用:定義靜態資料成員、靜態函式成員。

注意:因為 static 定義的變數分配在靜態區,所以其定義的變數的預設值為 0,普通變數的預設值為隨機數,在定義指標變數時要特別注意。

(3)extern 標識的變數或者函式宣告其定義在別的檔案中,提示編譯器遇到此變數和函式時在其它模組中尋找其定義。

c++中const的作用:

(1)const用於定義常量:const定義的常量編譯器可以對其進行資料靜態型別安全檢查

(2)const修飾函式形式引數:當輸入引數為使用者自定義型別和抽象資料型別時,將「值傳遞」改為「const & 傳遞」,提高效率。「引用傳遞」不需要產生臨時物件,省了臨時物件的構造、複製、析構過程消耗的時間。

(3)const修飾函式的返回值:如果給「指標傳遞」的函式返回值加上const,則返回值不能被直接修改,且返回值只能被賦值給const修飾的同型別指標。

(4)const修飾成員函式(函式定義體):任何不需要修改資料成員的函式都應該使用const修飾。const修飾類的成員函式的形式為: int getcount(void) const

class gameplayer

然而你所看到的是numturns的宣告式而非定義式。通常 c++ 要求你對你所使用的任何東西提供乙個定義式,但如果它是乙個 class 專屬常量又是static且為整數型別(intergral type,例如ints,chars,bools),則需特殊處理。只要不取他們的位址,你可以宣告並使用它們而無須提供定義式。但如果你取某個 class 專屬常量的位址,或縱使你不取其位址而你的編譯器卻(不正確地)堅持要看到乙個定義式,你就必須另外提供定義式如下:

const int gameplayer::numturns; // numturns 的定義;

// 下面告訴你為什麼給予數值[/code]

請把這個式子放進乙個實現檔案而非標頭檔案。由於class常量已在宣告時獲得初值,因此定義時不可以再設初值。

——以上所有來自《effective c++》第三版 p14

我不理解的是不取其位址的時候,可以訪問numturns?,於是我**進行驗證:

#include class gameplayer ;

const int gameplayer::numturns;

int main()

**的驗證結果和書中說的是一致的。那麼問題就來了,numturns 沒有定義的時候可以訪問,卻無位址,那它儲存在什麼地方呢?

於是我猜測,難道未定義時,編譯器會把它當成巨集來處理?只是進行了符號替換操作(我指的是狹義的工作方式,並不是指在預處理時候進行的替換),要不然怎麼會沒有位址呢?我網上查的時候看到乙個csdn的帖子內容挺好的。我將感覺能解釋的通的幾個點羅列了一下:

c++中static的作用:

(1)在函式體,乙個被宣告為靜態的變數在函式被呼叫的過程中維持其值不變。

(2)在模組內(在函式體外),乙個被宣告為靜態的變數可以被模組內所有函式訪問,但是不能被模組外的其他函式訪問。它是乙個本地的全域性變數。

(3)在模組內,被宣告為靜態的函式只能被這一模組內的其他函式呼叫。即函式被限制在宣告它的模組範圍內。

static 全域性變數與普通全域性變數的區別是:static全域性變數只初始化一次,防止其在其他檔案單元中被引用。

static 函式和普通函式的區別是:static函式在記憶體中只有乙份,普通函式在每乙個被呼叫中維持乙份複製品。

類中的靜態成員或者方法不屬於類的例項,而屬於類本身並在所有類的例項間共享。

7指標常量與常量指標

(1)指標常量是指定義了乙個指標,這個指標的值只能在定義時初始化,其他地方不能改變。

常量指標是指定義了乙個指標,這個指標指向乙個唯讀的物件,不能通過常量指標來改變這個物件的值。

(2)指標常量強調的是指標的不可改變性,而常量指標強調的是指針對其所指物件的不可改變性。

注意:無論是指標常量還是常量指標,其最大的用途就是作為函式的形式引數,保證實參在被呼叫函式中的不可改變特性。

const char *p    // (也可以寫成 「char const *p」) 宣告了乙個指向字元常量的指標, 因此不能改變它所指向的字元; 

char * const p // 宣告乙個指向 (可變) 字元的指標常量, 就是說, 你不能修改指標

8「野指標」

「野指標」產生原因及解決辦法如下:

(2)指標  p  被  free   或者  delete  之後,沒有置為  null。解決辦法:指標指向的記憶體空間被釋放後指標應該指向 null。

注意:「野指標」的解決方法也是程式設計規範的基本原則,平時使用指標時一定要避免產生「野指標」,在使用指標前一定要檢驗指標的合法性。

9常引用

常引用的引入主要是為了避免使用變數的引用時,在不知情的情況下改變變數的值。常引用主要用於定義乙個普通變數的唯讀屬性的別名、作為函式的傳入形參,避免實參在呼叫函式中被意外的改變。

說明:很多情況下,需要用常引用做形參,被引用物件等效於常物件, 不能在函式中改變實參的值,這樣的好處是有較高的易讀性和較小的出錯率。

C C 學習筆記 基礎知識6

1複雜表示式與序列點 序列點是乙個時間點 在整個表示式全部計算完畢之後或在 或逗號運算子處,或在函式呼叫之前 此刻塵埃落定,所有的 都已確保結束.ansi iso c 標準這樣描述 在上乙個和下乙個序列點之間,乙個物件所儲存的值至多只能被表示式的計算修改一次。而且前乙個值只能用於決定將要儲存的值。i...

C C 學習筆記 基礎知識7

1字元和字串 在 c 語言中字元用它們的字符集值對應的小整數表示。因此,你不需要任何轉換函式 如有你有字元,你就有它的值。數字字元和它們對應的 0 9 的數字之間相互轉換時,加上或減去常數 0 也就是說,0 的字元值。字串用字元陣列表示 通常你操作的是字元陣列的第乙個字元的指標,c語言從來不會把陣列...

C C 學習筆記 基礎知識10

1棧 堆和靜態區 一般來說,可以簡單的理解為記憶體分為三個部分 靜態區,棧,堆。其實堆疊就是棧,而不是堆。堆的英文是heap 棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性。記憶體也是這樣,記憶體的三個部分,不是所有的東西都能存進去的。靜態區 儲存自動全域性變數和static變數 包括st...