1. 程式人生 > >自我記錄:C語言編寫程式碼可能發生的問題與注意事項【陸續補充】

自我記錄:C語言編寫程式碼可能發生的問題與注意事項【陸續補充】

前言:該文章原創,不僅針對新手還是老手,均有一定幫助。若有錯誤地方,請不惜賜教。主要結合《C與指標》這本書,後續看過《C專家程式設計》、《C語言的XXX個問題》等書後會繼續補充。【非計算機類學生,目前更新進度緩慢】


編寫程式碼前的注意

①、程式設計風格影響程式碼的可讀性,這像是一個人的臉,學習並保持良好的程式設計風格是我們應該做的。

②、程式碼不能正常編譯可能不是程式碼的錯誤,也可能是編譯器的錯誤,換個編譯器試試看,而且要記住不同的編譯器有著不同的編譯方式。

③、注重C語言標準,比如C89C99C11等。


正文:

、不要在註釋符 /* ... */ 中再新增 /* ... */,即不允許巢狀(/* 會匹配下面離的最近的 */,而同時註釋掉其中包含的所有的 /*),且要注意註釋之間是否有不需要註釋的有效程式碼。

另用

#if 0
    statement
#endif

進行註釋更加安全。(statement 為要註釋的模組)

、若以double型輸入標量引數,最好請用float型輸出。在出現編譯結果為 0.000000 的時候,請考慮這條建議。 

double a;
scanf("%lf",&a);
printf("%f",a);

、scanf函式用 %s 格式碼輸入字串時,中間不能包含空白,否則只有空白前面的內容有效;用puts函式輸入時可以包含空白。

、用scanf函式時,標量引數的前面必須加上"&"符號,如果是陣列引數,則分兩種情況:1、出現下標引用,即  a[i] 的時候,則需加"&"號。2、下標為純數字,即 a[5] 的時候,可加可不加。

、printf函式對引數的計算順序是從右往左,函式引數計算順序也是一樣,而輸出順序是從左往右

int a = 0;
printf("%d,%d,%d",++a,++a,++a);

、for迴圈語句的三個表示式都是可選的。

for(表示式1;表示式2;表示式3){...}

、"==" 與 "=" 不同,在if語句裡千萬要注意。還有"&&" 與 "&" 等也不同。

、 "\ddd"  ddd表示1~3個八進位制數字。 "\xddd" ddd表示1~3個十六進位制數字。

、下面這組語句,前4條等價,第5條非法。

int a;
int
a;
int               a;
int/*comment*/a;
非法:
inta;

、C語言關鍵字,加上自定義標頭檔案裡的函式名不能用於識別符號,識別符號不能以純數字開頭。

C語言關鍵字
auto     do       goto     signed   unsigned
break    double if sizeof void
case else int static volatile
char     enum     long     struct   while   
const extern register switch  
continue float return typedef  
default for short union  

十一、在宣告整形變數時,如果宣告中有(unsigned signed short long等)至少一個說明符,關鍵字int可以省略。

short a; //等同於 short int a;

十二、宣告指標:

int *a;
int* a; //兩者相等。

但對於宣告多個指標則推薦第一種方法。

十三、你應該使用typedef而不是#define來建立新的型別名,因為後者無法正確處理指標型別。

#defiine a_char char*;
a_char a, b; 
//正確宣告 a ,但 b 宣告為字元。

十四、const 關鍵字宣告常量:

int const a;
const int a;
//兩者相等。

另對於指標:

int const *a;//一個指向整型常量的指標。可以修改指標的值,但不能修改它所指向的值。
int *const a;//一個指向整型的常量指標。指標的值不能修改,但可以修改它所指向的值。
int const *const a;//無論是指標本身的值還是所指向的值都不能修改。

十五、對於 goto語句,

1974年,D•E•克努斯對於goto語句爭論作了全面公正的評述,其基本觀點是:不加限制地使用goto語句,特別是使用往回跳的goto語句,會使程式結構難於理解,在這種情形,應儘量避免使用goto語句。但在另外一些情況下,為了提高程式的效率,同時又不致於破壞程式的良好結構,有控制地使用一些goto語句也是必要的。

本人認為在清理程式碼、返回錯誤、跳出多重迴圈的時候使用goto語句是很有效的,但從一個函式跳到另一個函式,或是重複回撥,或是死迴圈裡則不應該使用,多數情況下影響可讀性則避免使用。

另死迴圈的體現:

1、while(1);
2、for(;;);
3、Loop:
...
goto Loop;






更新日誌:

【2018/5/9】開始於5月9日晚編寫於 -十- 

【2018/5/10】下午編寫於 -十五-