c語言核心技術 一

2021-04-14 01:03:23 字數 2415 閱讀 5893

c語言編譯分析記號,有乙個原則是盡可能靠左合併符號使其得到符合語法的記號,所以

a+++b 會被解釋為 (a++)+b 而不是 a+(++b)

函式作用域和語句塊作用域:

一直以為函式內部申明的識別符號其作用域就叫做函式作用域,其實應該是語句塊作用域,它和函式作用域還是有區別的,語句塊作用域的作用範圍是從申明處開始,到包含這個申明的最小語句塊結束為止。即使你申明在函式的最開頭,他依然是屬於語句塊作用域,什麼樣的識別符號具有函式作用域呢? 嘿嘿,goto用的label

這個從目標**的角度來看就很明顯了,識別符號這些基本上是放在暫存器或堆疊內,沒有賦值之前自然沒法使用,label直接就翻譯成乙個位址,寫在jump命令裡,當然在函式內部哪都可以用了。

類似 x+=y之類的復合賦值運算表示式和 x=x+y這樣的表示式效果上有什麼區別麼?區別在於x+=y這種形式裡,左值x只被計算了一次,如果x是乙個有***的表示式,著兩種表達方式可能就不等價了。

逗號運算子的表示式操作順序是從左到右,所以整個運算結果是最後乙個表示式的結果,計算的順序可以得到保證。 但是在函式呼叫時,函式的引數列表裡面的逗號「並不是」逗號運算子,所以函式呼叫時,引數表示式的計算順序c語法是沒***的。

元素修飾符:

類似初始化結構體時,c99裡面可以用成員修飾符(類似 .member = value 的形式)來初始化特定的結構元素一樣,陣列的初始化可以用:

int a[30] = ;

這樣的形式來初始化第1,2,15,16個元素。

對陣列採用指標來操作通常可能比採用下標索引來操作要更有效率,按陣列操作可能涉及到計算索引再加基位址的問題,指標本身就可以遞增。

這個要看下標索引的計算複雜度,如果直接就是類似迴圈變數i這樣,其實下標表示還更快

測試一下:

int main()

return 0;

}迴圈部分彙編**,指標版還要多一條命令:

.l3:

movl    -12(%ebp), %eax # i, i.0

movl    $3, -176(%ebp,%eax,4)   #, a

addl    $1, -12(%ebp)   #, i

.l2:

cmpl    $9, -12(%ebp)   #, i

jle     .l3     #,

.l6:

movl    -16(%ebp), %eax # pa, pa

movl    $4, (%eax)      #,* pa

addl    $4, -16(%ebp)   #, pa

addl    $1, -12(%ebp)   #, i

.l5:

cmpl    $9, -12(%ebp)   #, i

jle     .l6     #,

如果下標計算比較複雜,指標就要更快了

int main()

return 0;

}迴圈部分彙編**,指標版要少兩條命令:

--------------

.l3:

movl    -12(%ebp), %eax # i, i

movl    %eax, %edx      # i, i

addl    %edx, %edx      # i

leal    (%edx,%eax), %eax       #, d.1786

movl    $3, -176(%ebp,%eax,4)   #, a

addl    $1, -12(%ebp)   #, i

.l2:

cmpl    $9, -12(%ebp)   #, i

jle     .l3     #,

movl    $0, -12(%ebp)   #, i

jmp     .l5     #

.l6:

movl    -16(%ebp), %eax # pa, pa

movl    $4, (%eax)      #,* pa

addl    $12, -16(%ebp)  #, pa

addl    $1, -12(%ebp)   #, i

.l5:

cmpl    $9, -12(%ebp)   #, i

jle     .l6     #,

彈性結構成員

c99允許結構體的最後乙個成員屬於不完整的陣列型別,如:

typedef struct a_t;

分配記憶體的時候,要用類似

malloc( sizeof(a_t) + 10*sizeof(int) );

的方式來為data陣列分配記憶體。

這種情況下,sizeof計算 a_t 的size的時候,這個彈性結構成員的大小是不會被計算的。

--- to do --- 寫乙個小**驗證一下

通常如非特殊必要,用指標的方式來實現結構體內的空間可變資料項,要比使用這種彈性結構成員更合適。

C核心技術手冊(一)

本章節描述c 語言的基本原理及特徵。c 是一種有各方面用途的過程語言。dennis ritchie 在1970 年在紐澤西州的貝爾實驗室首次設計了c 語言,目的是為實現unix 作業系統及其應用能夠最大程度與特定的硬體分離。c 語言的關鍵特性如下所述 l 輕便的原始碼 l 操作硬體的能力 l 高效 ...

C 核心技術篇(一)

簡介 目前,物件導向的設計思想已經被廣泛應用和認可。物件導向程式設計可以有效解決 復用的問題,他不同與以往的面向過程程式設計,面向過程程式設計需要將功能細分,而物件導向需要將不同功能抽象到一起。類是物件的實現,也可以是從現實生活中抽象的物件。物件導向的英文縮寫是oo,它是一種設計思想,現在這種思想已...

C核心技術手冊(二)

組成c 程式的 積木 叫做函式,每個函式都有自己的用途,並且可以相互呼叫。每個函式包含可被執行的語句,而這些語句可以分組,從而形成語句塊。做為程式設計師,你可以直接使用 c標準庫的的函式,也可以自己編寫函式來實現既定目的。除此之外,還有很多專用的庫可以使用,例如圖形函式庫。然而,使用這些非標準庫,會...