作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题[FAQ&FME] C 语言新手十诫
时间Thu Aug 25 12:00:06 2005
这篇可当做本板 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