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標準庫的的函式,也可以自己編寫函式來實現既定目的。除此之外,還有很多專用的庫可以使用,例如圖形函式庫。然而,使用這些非標準庫,會...