C語言學習筆記(二)

2021-05-02 17:44:46 字數 1312 閱讀 2863

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...