一、書寫風格
良好的程式設計風格是提高程式可靠性非常重要的手段,也是大型專案多人合作開發的技術基礎。具體的變成格式每家公司都有規範,但作為乙個初學者養成良好的程式設計風格還是有必要的。
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開闢空間...