C語言深度解剖小結

2021-06-18 14:20:26 字數 4660 閱讀 9724

ansi c標準c語言共有32個

關鍵字,這些關鍵字如下:

auto break case char const continue

default do double else enum extern

float for goto if int long

register return short signed sizeof static

struct switch typedef union unsigned void

volatile while

2023年12月16日,iso推出了c99標準,該標準新增了5個c語言關鍵字:

inline_restrict _bool _complex _imaginary

2023年12月8日,iso發布c語言的新標準c11,該標準新增了1個c語言關鍵字:

generic

----------------------------------->

static 修改變數 ,函式,主要兩個主面產生作用:作用域和生命週期;

sizeof後可以不加括號(sizeof是關鍵字不是函式),例如sizeof x;

引數指明為void,表示該函式不接受任何引數,例如void fun(void)不是void fun();

const定義的唯讀變數在記憶體只有乙份拷貝,例如const int x=5; int m=x;// m沒有記憶體分配

指標+1的操作,1的單位取決於當前指標的單位,例如int a[5]=;    

(int*)(a+1), (int*)(&a+1)與(int*)((int)a+1)中1的含義不一致;

sizeof(enum)是4,enum列舉變數中的值是列舉常量,相當於整型;
優先順序

運算子名稱或含義

使用形式

結合方向說明1

陣列下標

陣列名[常量表示式]

左到右()

圓括號(表示式)/函式名(形參表)

.成員選擇(物件)

物件.成員名

->

成員選擇(指標)

物件指標->成員名2-

負號運算子

-表示式

右到左單目運算子

(型別)

強制型別轉換

(資料型別)表示式

++自增運算子

++變數名/變數名++

單目運算子

--自減運算子

--變數名/變數名--

單目運算子

*取值運算子

*指標變數

單目運算子

&取位址運算子

&變數名

單目運算子

!邏輯非運算子

!表示式

單目運算子

~按位取反運算子

~表示式

單目運算子

sizeof

長度運算子

sizeof(表示式)3/

除表示式/表示式

左到右雙目運算子*乘

表示式*表示式

雙目運算子

%餘數(取模)

整型表示式/整型表示式

雙目運算子4+

加表示式+表示式

左到右雙目運算子-減

表示式-表示式

雙目運算子

5<<

左移變數《表示式

左到右雙目運算子

>>

右移變數》表示式

雙目運算子

6>

大於表示式》表示式

左到右雙目運算子

>=

大於等於

表示式》=表示式

雙目運算子

<

小於表示式《表示式

雙目運算子

<=

小於等於

表示式<=表示式

雙目運算子7==

等於表示式==表示式

左到右雙目運算子

!=不等於

表示式!= 表示式

雙目運算子8&

按位與表示式&表示式

左到右雙目運算子9^

按位異或

表示式^表示式

左到右雙目運算子10|

按位或表示式|表示式

左到右雙目運算子

11&&

邏輯與表示式&&表示式

左到右雙目運算子

12||

邏輯或表示式||表示式

左到右雙目運算子

13?:

條件運算子

表示式1? 表示式2: 表示式3

右到左三目運算子14=

賦值運算子

變數=表示式

右到左/=

除后賦值

變數/=表示式

*=乘後賦值

變數*=表示式

%=取模後賦值

變數%=表示式

+=加後賦值

變數+=表示式

-=減後賦值

變數-=表示式

<<=

左移後賦值

變數<<=表示式

>>=

右移後賦值

變數》=表示式

&=按位與後賦值

變數&=表示式

^=按位異或後賦值

變數^=表示式

|=按位或後賦值

變數|=表示式15,

逗號運算子

表示式,表示式,…

左到右從左向右順序運算

說明:同一優先順序的運算子,運算次序由結合方向所決定。

簡單記就是:! > 算術運算子 > 關係運算子 > && > || > 賦值運算子

注釋先於預處理指令處理,所以不能用巨集開始或結束一段注釋

可以這樣定義#define empty

將巨集所定義

的多條表示式放在大括

號中。示例:下面的語句只有

巨集的第一條表示式被執

行。為了說明問題,f

or 語句的書寫稍不符規範

。#define inti_rect_

value( a, b )\

a = 0;\

b = 0;

for (index = 0; index 

_num; index  )

inti_rect_

value( rect.a, rect.b );

正確的用法應為:

#define inti_rect_

value( a, b )\

for (index = 0; index 

_num; index  )

預處理指令中所有巨集標識答在使用前都應先定義,除了#ifdef  #ifndef  defined(),例如#if x<0//如果x未定義,預處理器可能不給提示,直接定義並置零

#pragma pack(n)對齊方式,3點注意事項:

1。每個成員分別按自己的方式對齊,並能最小化長度。

2。複雜型別(如結構,類)的預設對齊方式是他最長的成員的對齊方式,這樣成員是複雜型別時,可以最小化長度

3。對齊後的長度必須是成員中最大的對齊引數的整數倍,這樣在處理處理陣列時可以保證每一項都邊界對齊

"#"的使用:把語言符號轉化為字串

#define sqr(x) printf("the "#x"  is %d\n",((x)*(x)));

sqr(8);

output:

the 8 is 64

"##"的使用:把兩個語言符號組合成單個語言符號

#define xname(n) x##n

xname(8)

output:

x8注意:"#"和"##"在單一巨集定義中只使用其中乙個,且只一次,盡量不要使用這兩個運算子

----------------------------------->

int a[5];//建立5個int的陣列

sizeof(a[5]);// 值為4,正確,因為sizeof作為關鍵字,求值是在編譯的過程中,根據陣列型別來進行計算;

a與&a的值相同,但意義不一樣,a與a[0]意義一致,表示首元素位址,&a表示整個陣列的位址;

int a[3][2]=;與int a[3][2]=,,};的區分;

函式指標,函式指標陣列,函式指標陣列指標的區分;

----------------------------------->

可執行程式包括bss(block started by symbol)段、

資料段、

**段(也稱文字段),

然後還有堆heap,棧stack;

bss存放的是未初始化的

全域性變數

和靜態變數

,資料段存放的是初始化後的全域性變數和靜態變數,二者合併可以理解為全域性區;

區域性變數存放在棧區,動態變數存放在堆區;

----------------------------------->

函式名與返回值型別在語義上應不可衝突,典型反例是getchar,其返回值是int,所以char c;if(eof==(c=getchar())),這裡如果eof值定義在char型別的int範圍以外,就會發生截斷;

----------------------------------->

C語言深度解剖

1.關鍵字 是編譯器能認識的特殊字串符號。c語言共有32個關鍵字,含sizeof,計算物件所佔記憶體空間的大小。2.定義 建立乙個物件並分配一塊記憶體。3.宣告 告訴編譯器,名字已經匹配到了一塊空間,別的地方不能用它來作為變數名或物件名。宣告沒有分配記憶體,可以出現多次宣告。4.區域性變數 也叫自動...

C語言深度解剖

c語言深度解剖 本書目錄結構如下 第一章 關鍵字 1.1 最寬恒大量的關鍵字auto 1.2 最快的關鍵字register 1.3 最不實名的關鍵字static 1.4 基本資料型別 1.5 最冤枉的關鍵字sizeof 1.6 if else組合 1.7 switch case組合 1.8 do w...

c語言深度解剖筆記

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