C語言程式設計需注意的方面 筆記

2021-06-15 21:19:10 字數 3723 閱讀 6071

一、書寫風格

良好的程式設計風格是提高程式可靠性非常重要的手段,也是大型專案多人合作開發的技術基礎。具體的變成格式每家公司都有規範,但作為乙個初學者養成良好的程式設計風格還是有必要的。

1、空行的使用

空行起著分隔程式段落的作用。空行得體(不過多也不過少)將使程式的布局更加清晰。空行不會浪費記憶體,所以不要捨不得用空行。但空行也不宜太多,一般情況是這樣的:

a、預處理語句後要加空行;

b、變數宣告或函式宣告之後加空行;

c、變數的宣告與定義之間盡量加空行;

d、乙個功能段結束之後加空行,如:if、while等語句完畢以後加空行;

e、程式返回return前加空行。

2、修飾符的使用

修飾符 * 和 & 應該靠近資料型別還是該靠近變數名,要靠個人的習慣,本人是將修飾符* 靠近變數定義的,因為靠近資料型別,例如:int*  x; 從語義上講此寫法比較直觀,即x是int 型別的指標。但這很容易引起誤解,例如:int*  x, y; 此處y容易被誤解為指標變數。不益於程式的閱讀。

3、空格和括號的使用也要注意,盡量讓程式清晰易讀。

4、程式的注釋是不可少的。

二、變數

1、變數定義的次序

最好把同型別的定義在一起,最好把長度小的定義在前面,這樣可以優化儲存器布局,有可能節約空間,特別是在嵌入式系統儲存器比較緊張的情況下更是如此。

2、變數的宣告、定義和初始化

變數宣告時賦值可以使程式簡潔,很多情況下推薦使用,但有時會給程式帶來麻煩,特別是在多檔案模組的程式中,所以全域性變數盡量先宣告後賦值(全域性變數只能賦初值一次)。 

3、變數型別轉換

整型與字元型的轉換。

#include

int  main()

大家可以試試輸出什麼,所以不要想當然。

另外浮點型和整型的轉換也要注意

4、const修飾變數情況:

const char *p;  //指向常量的指標,內容不可變,但指標可以變。

char * const p; //指標為常量,不可變,但內容可以變。

三、運算子及表示式

變數的值和表示式的值

i++和++i的區別:

i++是運算之後再加1;

++i是加1後再運算;

例(注意區別):

int  main()

int  main()

int  main()

int  main()

四、迴圈

1、迴圈的退出

迴圈的正常退出有四種方式:break、continue、exit、return,注意他們的區別:

break:完全退出迴圈;

continue:退出本次迴圈,繼續下次迴圈;

exit:退出整個程式;

return:在子函式中,退出函式體,在main函式中退出整個程式。

2、迴圈的使用

a、巢狀迴圈中盡量將迴圈次數少的迴圈作為外迴圈,這樣可以減少cpu跨切迴圈層的次數。

b、我們通常寫迴圈都是這樣的for(i=0; i3、無限迴圈

while(1)

要比 for(;;)

好一些。通常用while迴圈。

五、比較語句

比較語句中,千萬要留意無論是float還是double型別的變數都有精度限制所以一定要避免將浮點變數用==或!=與數字比較應該設法轉化成》=或<=形式。

動手試著寫出與零比較的if語句。

六、函式

函式介面的兩個要素是引數和返回值,程式設計過程中經常出現函式功能實現沒問題,但就是不能得到正確的值。

1、函式的宣告

void setvalue(int width, int height); //我們經常使用的格式

void setvalue(int, int);         //不良的風格,但經常看到

float getvalue(void);          //良好的風格

float getvalue();   //不良的風格,我們經常使用

2、函式的返回值

c語言中,凡不加型別說明的函式,一律自動按整型處理。經常會被誤解為void型別。

有的函式不需要返回值,但為了增加靈活性如支援鏈式表達,可以附加返回值。

函式呼叫結果的返回可以通過三種方式實現:全域性變數,return,指標引數。

3、函式的功能要單一,不要設計多用途的函式。

4、注意函式的形參和實參有各自的儲存單元。

七、指標和陣列

c程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在程式執行的過程中保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。

易出錯的地方:

1、

int * p;

int q[10];  //宣告指標和陣列

++p;       //正確

++q;       //錯誤

陣列名只對應一塊記憶體,不可改變,內容可變;

指標指向一塊記憶體,可改變。

2、

free(p);  //釋放後p並不等與null,只是將其指向的內容free掉了,如果在進行操作會帶來不可預料的錯誤,常用的辦法是在此句後面將p=null。

3、

像void fun(char str[10]){};這樣以陣列作為引數時一定要注意:

陣列的長度是傳不過來的這樣 void fun(char str[10], int 10){};用乙個整型數單獨傳陣列的長度。

在函式中使用sizeof(str) //=4,因為在引數傳遞時傳的是陣列的位址(指標),不在是陣列名了。

4、

int i, *j;

scanf("%d", &i); //正確

scanf("%d", j);  //錯誤,因為指標j為空指標,沒有申請空間。

5、

char str[6] = "hello";

strlen(str)  //=5,不包括'/0'。

sizeof(str)  //=6,注意區分。

6、

char p = "hello"; //存在棧空間,函式結束就釋放了。

char *p = "hello";  //為字串常量,存在於靜態儲存區。所以試圖改變*p的操作都會失敗。

7、   

應當將指標變數用==或!=與null比較

c程式設計中需注意的問題

1.對於指標變數,乙個非常中的操作就是要判斷其有效性,即是否為空指標。如利用動態記憶體申請運算子申請記憶體後,需要首先對記憶體是否申請成功進行判斷。2.static 再c語言中宣告函式時,該static 函式只具有檔案作用域。及該函式的作用域被限制再宣告它的模組內。3.變數型別的自動轉換 當乙個操作...

FPGA設計需注意的方方面面

不管你是一名邏輯設計師 硬體工程師或系統工程師,甚或擁有所有這些頭銜,只要你在任何一種高速和多協議的複雜系統中使用了fpga 你就很可能需要努力解決好器件配置 電源管理 ip整合 訊號完整性 和其他的一些關鍵設計問題。不過,你不必獨自面對這些挑戰,因為在當前業內領先的fpga公司裡工作的應用工程師每...

C語言程式設計注意點

1 scanf d input scanf要用位址符 字串除外 scanf s input 因為字串名字即為字串首位址 scanf s input 遇到空格即結束,gets input 遇到空格不結束,遇到回車結束 scanf s input 如果input是char 一定要先用malloc開闢空間...