11、structure
結構體可以用或者來進行初始化
例如:但是{}本身不是expression,不能對struct進行賦值!
以下用法是錯誤的:
c99增加了對一種語法如下,但是vc9中不支援這種語法,因此應該盡量避免採用。
結構體的成員名和變數名不在同一命名空間中,因此兩者不會出現明明衝突。
另外,結構體可以相互賦值和初始化,但是無法進行==運算。
12、tip on left
由.運算子組成的表示式能不能做左值取決於.運算子左邊的表示式能不能做左值。在上面的例子中,z
是乙個變數,可以做左值,因此表示式z.x
也可以做左值,但表示式add_complex(z, z).x
只能做右值而不能做左值,因為表示式add_complex(z, z)
不能做左值。
13、enum
列舉型別的成員是整數常量,它們的值由編譯器自動從0開始順序分配,也可以自己指定每乙個成員的常量值。如果只指定了部分成員的常量值的話,對於未賦值成員,編譯器會從上乙個賦值成員開始順序累加。
成員的常量值是可以重複的,此時用這兩個成員進行賦值的效果完全相同,對於取值分別為這兩個成員的enum變數,程式認為他們是完全相等的。
以上**中,pt4和pt1完全等價。
列舉的成員名和變數名在同一命名空間中,所以會出現命名衝突。
考慮以下來自的**,編譯器是否會報錯?是的話如何修正,不是的話執行結果如何?
14、array
陣列型別做右值使用時,自動轉換成指向陣列首元素的指標。
寫**時應盡可能避免硬編碼。
c中陣列採用row-major儲存,多維陣列總是從最右邊乙個下標開始由0向上遞增儲存
15、memberwise initialization
用於對enum, struct, array中離散的個別元素進行初始化。
16、string
當乙個字元型指標或字元型陣列在定義的同時被用乙個字串初始化,那麼這個字串會被放到唯讀的資料段內。
即,如下**: 或
和如下**:
似乎是等價的,只是嘗試對前者進行賦值的錯誤無法被編譯器檢查出來。
(這一點很奇怪,如果c標準規定了用字串初始化時的行為,那麼編譯器為何不能檢查出來?如果c標準並未這樣定義,那麼這些都是編譯器自己的行為?)
另外,用字串對int陣列進行初始化的行為是不被gcc所支援的,但是在vc9中可以正常運作。被初始化的陣列同樣會被放到唯讀的資料段。
C語言學習筆記(二)
c語言學習筆記 二 八進位制 把二進位制所有數字從右向左的每三個數字分成一組,每組用乙個數字替代,替換後的結果叫八進位制 0110 1010 01 101 010 1 5 2 八進位制 o 佔位符 0152 八進位制開頭數字必須用0開頭 十六進製制 把二進位制所有數字從右向左的每四個數字分成一組,沒...
C語言學習筆記(二)
1.題目 編寫程式,列印菱形星號組合 1 include 2 int main 3 2.a 10 逆序輸出陣列 1 include 2 int main 3 4 int n,i 5 for i 0 i 5 i 6 11 for i 0 i 9 i 12 15 return 0 16 173.氣泡排序...
c語言學習筆記二
函式 注 linux下執行.c執行以下命令 gcc filename.c lm 由於數學函式位於libm.so中 a.out c標準庫和glibc c標準庫 描述c的語法 描述c標準庫 glibc 是linux平台上最廣泛的c函式庫 包括標準庫和所有系統庫 數學函式 示例 include inclu...