自我記錄:C語言編寫程式碼可能發生的問題與注意事項【陸續補充】
前言:該文章原創,不僅針對新手還是老手,均有一定幫助。若有錯誤地方,請不惜賜教。主要結合《C與指標》這本書,後續看過《C專家程式設計》、《C語言的XXX個問題》等書後會繼續補充。【非計算機類學生,目前更新進度緩慢】
編寫程式碼前的注意:
①、程式設計風格影響程式碼的可讀性,這像是一個人的臉,學習並保持良好的程式設計風格是我們應該做的。
②、程式碼不能正常編譯可能不是程式碼的錯誤,也可能是編譯器的錯誤,換個編譯器試試看,而且要記住不同的編譯器有著不同的編譯方式。
③、注重C語言標準,比如C89、C99、C11等。
正文:
一、不要在註釋符 /* ... */ 中再新增 /* ... */,即不允許巢狀(/* 會匹配下面離的最近的 */,而同時註釋掉其中包含的所有的 /*),且要注意註釋之間是否有不需要註釋的有效程式碼。
另用
#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語言關鍵字,加上自定義標頭檔案裡的函式名不能用於識別符號,識別符號不能以純數字開頭。
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】下午編寫於 -十五-