[FAQ&FME] C 語言新手十誡
看板C_and_CPP (C/C++)作者khoguan (Khoguan Phuann)時間19年前 (2005/08/25 11:46)推噓5(5推 0噓 3→)留言8則, 5人參與討論串1/14 (看更多)
這篇可當做本板 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)
推
210.243.237.65 08/25, , 1F
210.243.237.65 08/25, 1F
→
210.243.237.65 08/25, , 2F
210.243.237.65 08/25, 2F
→
210.243.237.65 08/25, , 3F
210.243.237.65 08/25, 3F
→
210.243.237.65 08/25, , 4F
210.243.237.65 08/25, 4F
推
59.113.161.203 08/25, , 5F
59.113.161.203 08/25, 5F
推
61.222.148.171 08/25, , 6F
61.222.148.171 08/25, 6F
推
218.163.127.185 08/25, , 7F
218.163.127.185 08/25, 7F
※ 編輯: khoguan 來自: 220.130.208.168 (08/25 13:37)
推
220.130.208.168 08/25, , 8F
220.130.208.168 08/25, 8F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 14 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章