C_and_CPP 板


LINE

這篇可當做本板 FAQ & FME 內容的一部份,請大家改正及補充。 (FME -- Frequently Made Errors) ---------------------------------------------------------- C 語言新手十誡(The Ten Commandments for Newbie C Programmers): 注意:以下所舉的錯誤例子如果在你的電腦上印出和正確例子相同的結果, 那只是不足為恃的一時僥倖。 一、你不可以使用尚未給予適當初值的變數。 錯誤: int sum; int num; for (num = 1; num <= 10; num++) sum += num; 正確: int sum = 0; int num; for (num = 1; num <= 10; num++) sum += num; 二、你不可以提取(dereference)不知指向何方的指標(包含 null 指標)。 錯誤: char *pc; *pc = 'a'; 正確: char c; char *pc = &c; *pc = 'a'; 三、你不可以將字串常數賦值(assign)給 char* 變數,然後透過該變數 改寫字串的內容。(只能讀不能寫) 錯誤: char* pc = "john"; *pc = 'J'; printf("Hello, %s\n", pc); 正確: char pc[] = "john"; *pc = 'J'; /* 或 pc[0] = 'J'; */ printf("Hello, %s\n", pc); 四、你不可以存取超過陣列既定範圍的空間。 錯誤: int str[5]; int i; for (i = 0; i <= 5; i++) str[i] = i; 正確: int str[5]; int i; for (i = 0; i < 5; i++) str[i] = i; 五、(請幫忙補足) 六、你不可以在函式中回傳一個指向區域性自動變數的指標。 [感謝 gocpp大大 提供例子] 錯誤: char *getstr(char *name) { char buf[30] = "hello, "; strcat(buf, name); return buf; } 正確: void getstr(char buf[], int buflen, char const *name) { char const s[] = "hello, "; assert(strlen(s) + strlen(name) < buflen); strcpy(buf, s); strcat(buf, name); } [針對字串操作,C++提供了更方便安全的 string class, 能用就盡量用] #include <string> using std::string; string getstr(string const &name) { return string("hello, ") += name; } 七、你不可以只做 malloc(), 而不做相應的 free(). [C++] 你不可以只做 new, 而不做相應的 delete. 八、你不可以在一個運算式(expression)中,對一個基本型態的變數 修改其值超過一次以上。 錯誤: int i = 7; int j = ++i + i++; 正確: int i = 7; int j = ++i; j += i++; 九、你不可以在一個運算式(expression)中,對一個基本型態的變數 修改其值,而且還在同一個式子的其他地方存取該變數的值。 錯誤: int arr[5]; int i = 0; arr[i] = i++; 正確: int arr[5]; int i = 0; arr[i] = i; i++; [C++例子] 錯誤: int i = 10; cout << i << "==" << i++; 正確: int i = 10; cout << i << "=="; cout << i++; 十、你不可以在macro的定義中,不為它的參數個別加上括號。 錯誤: #define SQUARE(x) (x * x) 正確: #define SQUARE(x) ((x) * (x)) 後記:從「古時候」流傳下來一篇文章 "The Ten Commandments for C Programmers"(Annotated Edition) http://www.lysator.liu.se/c/ten-commandments.html 一方面它不是針對 C 的初學者,一方面它特意模仿中古英文 聖經的用語,寫得文縐縐。所以我現在另外寫了這篇,希望 能涵蓋最重要的觀念以及初學最易犯的錯誤。原則上,列十條, 我寫的很可能不具代表性,歡迎提供更適合的條目。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: khoguan 來自: 220.130.208.168 (08/25 12:01)
1F:推 sjgau:十一 取用一個新的變數或函數名稱,先使用再宣告 210.243.237.65 08/25
2F:→ sjgau:如此,可以避免使用既有的名稱 210.243.237.65 08/25
3F:→ sjgau:十二 穩紮穩打,步步為營 210.243.237.65 08/25
4F:→ sjgau:有任何懷疑或信心不夠的地方,先求證再推進 210.243.237.65 08/25
5F:推 Solccp:1的正確例中 sum+=i 應為sum+=num ?? 59.113.161.203 08/25
6F:推 renderer:推 k 大真好 :) 61.222.148.171 08/25
7F:推 SHBK:推218.163.127.185 08/25
※ 編輯: khoguan 來自: 220.130.208.168 (08/25 13:37)
8F:推 khoguan:謝謝 Solccp大大,已經改過來了。220.130.208.168 08/25







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP