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 的初学者,一方面它特意模仿中古英文 圣经的用语,写得文绉绉。所以我现在另外写了这篇,希望 能涵盖最重要的观念以及初学最易犯的错误。原则上,列十条, 我写的很可能不具代表性,欢迎提供更适合的条目。 --
QR Code



※ 发信站: 批踢踢实业坊(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灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP