C語言細節

2021-09-01 10:18:13 字數 2338 閱讀 5830

參考:

注釋必須和**一起維護,不應該描述顯而易見的事,或把別的地方已說清楚的東西在說一遍。

字面常量沒有語義,也沒有真正的記憶體位址。

所以不可以取其位址,也不可以用於初始化普通引用,例如:long &r1 = 40000;

但是const long &r1 = 40000 卻是合法的。

所以,盡量不要使用字面常量,而應該使用列舉常量和初始化過的常變數

全域性變數增加了模組間的耦合。

當全域性變數(靜態變數)用來初始化的值不能在編譯時就計算妥當,則該初始化動作就會拖到執行期,這容易導致致命錯誤。可以使用單價模式解決這個問題

函式過載主要用於一組抽象意義相同,但實現不同的函式。

而形式引數預設值主要出於簡化,為函式提供更簡潔的介面。

(1)由於引用沒有位址,宣告引用的引用、指向引用的指標或引用的陣列都是不合法的。

(2)引用不可以有常量性或揮發性,所以不可以用關鍵字const或volatile來修飾引用。

(3)任何能作為左值的複雜表示式都能作為引用的初始化物

(4)char *cp = reinterpret_cast(a); // 對cp取位址則錯誤

reinterpret_cast(a) = cp;// 正確,

(5)指向陣列的引用保留了陣列的尺寸資訊,而指標則不保留(這個性質有時在陣列名作為函式實參進行呼叫函式時使用)

(6)可以宣告函式的引用:

ex: int f( double );

int (* const pf) (double) = f; // pf是指向函式f()的常量指標

int (&rf) (double) = f; // rf是函式f()的引用

可以把引用或函式本身(隱式)轉換成指向函式的指標,再使用反引用語法。

(1)字母常量沒有位址,永遠不可以作左值

(2)int ci; const int *ip2 = &ci 的const只描述了通過ip2對ci的操作限制,而不是對ci的一般操作的限制。也就是說ci = 5可以,而*ip2 = 5不可以。

(1)如果?表示式中的兩個選擇結果都是左值,則該表示式本身就是個左值。

(2)case語句的標籤必須是整形常量性的表示式(必須在編譯時就要算出case中值)

(1)要提供乙個放置各種適當前置宣告的專用標頭檔案

(2)把class的介面與其實現分離,從而要達到真正的資料隱藏之境,而其不二法門則是運用橋接設計模式

(3)使用橋接,任何對於class c實現的修改,只要不改變class c的介面,影響就會被牢牢地鉗制在乙個單獨的實現檔案。

通常的目標是:書寫乙個像包含乙個單獨的函式呼叫語句的巨集。

這意味著:呼叫者需要提供最終的分號,而巨集體則不需要。

因此巨集體不能為簡單的括弧包圍的復合語句,因為如果這樣,呼叫的時候就會發生語法錯(明顯是乙個單獨語句,但卻多了乙個分號)。每行的最後用\連線

一般用乙個單獨的用括弧括起來的」引數「定義和呼叫巨集,引數在巨集擴充套件的時候成為類似printf()那樣的函式的整個引數列表。

#define debug(args) (printf(「debug: 」), printf arg)

if(n != 0) debug((「n is %d\n」, n));

明顯缺陷是必須記住使用一對額外的括弧。

getchar()可能返回任何字元,包括eof

所以若後面緊跟著fgets(),則換行符會被fgets()取走。所以不要混用scanf和fgets,或者專門在scanf後用乙個getchar()來接換行符

文字/二進位制區別只是發生在檔案開啟時,開啟後,一切i/o函式相同

對整型使用%d,長整形為%ld,浮點型為%f。

但是當目標串長度過大時,會用多個』\0』填充。

strcat就可以自動加』\0』

所以從十進位制小數轉成二進位制再轉回去就會不一樣。

ex: if(fabs(a - b)) <= epsilon * fabs(a) )

使用次序必須是va_list, va_start(),va_arg(),va_end()

int vprintf(char *format, va_list param);

int vfprintf(file *stream, char *format, va_list param);

int vsprintf(char *string, char *format, va_list param);

int vscanf(char *format, va_list param);

int vsprintf(char *string, char *format, va_list param);

int vsscanf(char *s, char *format, va_list param);

C語言細節

a b 先賦值再自增 a b先自增再賦值 float 6 4是1.500000 float 6 4 是1.000000 原始檔.c 目標程式.obj 執行程式.exe 都是二進位制檔案 源程式以ascii 形式存於文字檔案 c程式演算法可無輸入必須要有輸出 三種基本結構可以完成任何複雜的任務 大括號...

C語言細節

1.c誰呼叫了main函式 linux執行乙個程式就是建立乙個新程序,然後把這個程式丟到這個程序中執行直到結束。linux通過.task執行程式,新程序作為命令程序的乙個子程序執行。main函式的返回值最終會返回給父程序。父程序的引數傳遞給子程序。2.void型別的本質 void的意思是乙個變數還不...

C 語言細節總結

include intmain int int2 10 double double1 double double2 10 printf sizeof str1 d,sizeof str2 d r n sizeof str1 sizeof str2 printf sizeof int1 d,sizeo...