c語言深度解剖筆記1

2021-07-23 21:46:03 字數 2810 閱讀 1194

2016.8.14 dage

複習內容:c語言深度解剖筆記1

有三大類:算術運算子、關係運算子與邏輯運算子,還有位運算子等,,,

相同優先順序運算子,從左至右依次運算。注意字尾運算優先順序高於字首。因此++i++應解釋為++(i++)。

基本表示式 1級 最高

字尾表示式 2極

單目/一元運算 3級

強制型別表示式 4級

乘法表示式 5級

加法運算子 6級

移位運算子 7級

關係運算子 8級

相等運算子 9級

位與運算子 10級

位異或運算子 11級

位或運算子 12級

邏輯與運算子 13級

邏輯或運算子 14級

三元條件運算子 15級

賦值運算子 16級

逗號運算子 17級

結合性:
1.c語言中各運算子的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。

例如算術運算子的結合性是自左至右,即先左後右。

最典型的右結合性運算子是賦值運算子。

2.右結合性:否定!,按位取反~,++,--,+,-,*,&,強制型別轉換,sizeof,問號表示式?:,賦值:*=,+=,-=,/=,>>=,&=...

3.所有的優先順序中,只有三個優先順序是從右至左結合的,它們是單目運算子、條件運算子、賦值運算子。其它的都是從左至右結合。

1.if-else

在編寫**是,要使得正常情況的執行**清晰,確認那些不常發生的異常情況處理

**不會遮掩正常的執行路徑。這樣對於**的可讀性和效能都很重要。

非常重要的一點是,把正常情況的處理放在 if 後面,而不要放在 else 後面。

2.switch

case 後面只能是整型或字元型的常量或常量表示式(列舉型別好像也可以)

1.break和continue

break表示終止本層迴圈。

continue 表示終止本次(本輪)迴圈。當**執行到 continue 時,本輪迴圈終止,進入下一輪迴圈。

注意switch可以使用break但是不能使用continue

2.使用迴圈需要注意

在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的迴圈放在最外層,以減少 cpu 跨切迴圈層的次數。

把迴圈巢狀控制在 3 層以內。

如果乙個函式沒有規定返回值的型別,void,int,float等,那麼會預設為int型

若函式不接受任何引數,一定要指明引數為 void。

return 用來終止乙個函式並返回其後面跟著的值。

return 語句不可返回指向「棧記憶體」的「指標」,因為該內存在函式體結束時被自動銷毀。

const定義的與define定義的變數的區別:

const定義的變數const int a = 100(這時沒有給a分配記憶體);在給別的變數進行賦值時,int b = a;(這時給a分配記憶體,以後不再分配)

如int c = a;此時不再分配

define定義的巨集常量#define m 3,在程式裡面如果int a = m;和int b = m;在程式的預編譯時會進行巨集替換,每次使用分配記憶體

#define巨集沒有型別,const定義的唯讀變數具有特定的型別

const定義的變數是唯讀變數,存放在靜態區。

const int 與 int const等價,後面可以是變數或者陣列,看下面的指標也可以

const修飾指標:

const int *p; // p 可變,p 指向的物件不可變 //const 修飾*p,p 是指標,*p 是指標指向的物件,不可變

int const *p; // p 可變,p 指向的物件不可變 //const 修飾*p,p 是指標,*p 是指標指向的物件,不可變

int *const p; // p 不可變,p 指向的物件可變 //const 修飾 p,p 不可變,p 指向的物件可變

const int *const p; //指標 p 和 p 指向的物件都不可變 //前乙個 const 修飾*p,後乙個 const 修飾 p,指標 p 和 p 指向的物件都不可變

判斷方法:先忽略型別名(編譯器解析的時候也是忽略型別名),我們看 const 離哪個近。離誰近就修飾誰。

const也可以修飾函式傳的引數,表示引數不可改變

int i = 10;

const int *p = &i;

*p = 100; //error

i = 100; //true

這時*p = 100

extern 可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中。

extern 在宣告變數時不能為其賦值,在宣告變數時變數的型別不能改變,int a = 100;extern double a;就會報錯

它將一些相關聯的資料打包成乙個整體,方便使用。

有的說乙個空的結構體大小是1,但我測試出來是0……

ps:柔性陣列:結構中的最後乙個元素允許是未知大小的陣列,這就叫做柔性陣列成員,但結構中的柔性陣列成員前面必須至少乙個其他成員。

柔性陣列成員允許結構中包含乙個大小可變的陣列。sizeof 返回的這種結構大小不包括柔性陣列的記憶體。包含柔性陣列成員的結構用

malloc ()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。

C語言深度解剖(1)

關鍵字 其中一部分 還有一些在老師講的課件裡面 register 宣告暫存器變數 const 宣告唯讀變數 volatile 說明變數在程式執行中可被隱含的改變 extern 宣告變數是在其他檔案中宣告 也可以看作是引用變數 goto 無條件跳轉語句 register register變數必須是乙個...

C深度解剖筆記(1)

register register變數可能不存放在記憶體中,所以不能用 來獲取它的位址 static 1.靜態全域性變數 作用於僅限於變數被定義的檔案中,其他檔案用extern也沒法使用它 2.靜態區域性變數 函式執行結束,靜態變數值也不會銷毀,下次進入函式仍能用到原來的值 3.靜態函式 函式的作用...

c語言深度解剖筆記

關鍵字 register 這個關鍵字請求編譯器盡可能的將變數存在 cpu內部暫存器中而不是通過記憶體定址訪問以提高效率。注意是盡可能,不是絕對。你想想,乙個 cpu的暫存器也就那麼幾個或幾十個,你要是定義了很多很多 register 變數,它累死也可能不能全部把這些變數放入暫存器吧,輪也可能輪不到你...