原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
我认为如果一个人会不小心把 a==1 写成 a=1 且不自知,
那说明他不是一个好的程序员,或者如果他是一个好的程序员,那么说明他的工作状态不好需要休息。
原帖由 samon_fu 于 2008-11-7 17:39 发表
这个东西就象工程中,大家都把read、write、malloc等函数包一层来使用一样的。
在工程中哪些东西最经常用的,你也可以包一下做成库来用。
比如你担心用了释放后的指针,那你包的时候只需要判断下对应指针 ...
原帖由 samon_fu 于 2008-11-7 17:48 发表
要想成为一个好的程序员(?兄弟们别老想着程序员啊),习惯很重要。
而一个好习惯的养成始于态度。
兄弟们每写一行代码的时候,想着这代码以后要给自己看,就OK了:),
很多时候思路比写、调试代码重要 ...
原帖由 samon_fu 于 2008-11-7 17:48 发表
要想成为一个好的程序员(?兄弟们别老想着程序员啊),习惯很重要。
而一个好习惯的养成始于态度。
兄弟们每写一行代码的时候,想着这代码以后要给自己看,就OK了:),
很多时候思路比写、调试代码重要 ...
最近刚完成一个项目。项目是在老外原有的代码上增加新的功能。以前写代码时习惯了在用指针前先检查一下指针是否为空。所以在这个项目也是这样做的。
但老外直接跟我们说不要那样干,那样会隐藏你的BUG。
想想也是有道理的。从逻辑上来讲,有时候根本不允许所用的指针为空,如果用判断来知道这个指针是空的,这时又要怎么办呢?输出一句话让调试的人
知道有错误了? 他们的做法是只在新申请的内存时检查是否为空,如果为空就做些内存清理的工作,腾出些空间。在其他用指针的环境下都不检查
指针是否为空。该调用方法的就调用方法,该往内存中写的就写。如果指针是空就让程序 crash 掉。这些能及时发现问题。如果不能及时发现问题,那只
能证明所做的测试还不够。
原帖由 samon_fu 于 2008-11-7 17:48 发表
要想成为一个好的程序员(?兄弟们别老想着程序员啊),习惯很重要。
而一个好习惯的养成始于态度。
兄弟们每写一行代码的时候,想着这代码以后要给自己看,就OK了:),
很多时候思路比写、调试代码重要 ...
// Template of smart pointer // The class T must have Lock() & Unlock() methods template<class T> class SmartPtr { public: explicit SmartPtr(T *t = 0) : pt(t) { Inc(); } SmartPtr(const SmartPtr<T> & p) : pt(p.pt) { Inc(); } ~SmartPtr() { Dec(); } operator bool() const { return pt != 0; } T *operator->() const { return pt; } bool operator==(const SmartPtr<T> & p) const { return pt == p.pt; } bool operator!=(const SmartPtr<T> & p) const { return pt != p.pt; } SmartPtr<T> &operator=(const SmartPtr<T> & p) { if (pt != p.pt) Dec(), pt = p.pt, Inc(); return *this; } private: void Inc() const { if (pt) pt->Lock(); } void Dec() const { if (pt) pt->Unlock(); } T &operator*(); T *pt; }; |
原帖由 flyeleph 于 2008-11-7 23:32 发表
最近刚完成一个项目。项目是在老外原有的代码上增加新的功能。以前写代码时习惯了在用指针前先检查一下指针是否为空。所以在这个项目也是这样做的。
但老外直接跟我们说不要那样干,那样会隐藏你的BUG。
想想 ...
原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
原帖由 flyeleph 于 2008-11-7 23:32 发表
最近刚完成一个项目。项目是在老外原有的代码上增加新的功能。以前写代码时习惯了在用指针前先检查一下指针是否为空。所以在这个项目也是这样做的。
但老外直接跟我们说不要那样干,那样会隐藏你的BUG。
想想 ...
原帖由 samon_fu 于 2008-11-9 18:26 发表
不是有man手册吗? 想了解库函数的功能足够了啊。
另:在内核里,空指针确实是非常恐怖的一件事情,一般就是panic、crash, then reboot,呵呵。
经验丰富一点的,还是可以通过看寄存器里的东东来调试哦。
原帖由 flw 于 2008-11-7 13:49 发表
给大家推荐两本书:
types and programming languages :
http://www.paid4share.net/file/6 ... 0262162091-rar.html
advanced topics in types and programming languages :
http://depo ...
原帖由 flyeleph 于 2008-11-7 23:32 发表
最近刚完成一个项目。项目是在老外原有的代码上增加新的功能。以前写代码时习惯了在用指针前先检查一下指针是否为空。所以在这个项目也是这样做的。
但老外直接跟我们说不要那样干,那样会隐藏你的BUG。
想想 ...
原帖由 noword2k 于 2008-11-10 12:24 发表
释放后置NULL是好习惯。
使用前不必检测是否为NULL,因为如果是NULL,程序直接崩溃,程序员能直接定位到崩溃点,进行DEBUG。
strcpy前是否用memset,要看接下来的运算,是把这段数据作为字符串用,还是作 ...
catch让代码难看,执行时浪费系统资源
野指针,C永远的痛
原帖由 flw 于 2008-11-7 13:45 发表
从某种程度上讲,那种所谓的 1 == a 和 free(p); p=NULL; 还有 memset(buf,0x00,sizeof(buf)); strcpy(buf,str); 等预防 BUG 的技巧恰恰是在阻碍程序员的成长。
写程序一定要注意语义,语义清晰,错误就会少 ...
原帖由 flw 于 2008-11-9 20:33 发表
原帖由 retuor 于 2008-11-9 20:32 发表
我以为他写的是
buf[strlen(buf)]='\0'.
这可比他那句强多了。
原帖由 xie995 于 2008-11-11 23:24 发表
这种写法也不太好。strlen也要降低程序的效率,有时候是不可接受的。
大家写C主要就是图效率,降低效率的东西最好还是少用。有时候注意一下这些方面,效率提高一倍都可能。
原帖由 雨过白鹭洲 于 2008-11-12 23:05 发表
我写代码从不把效率放在第一位,特别是所谓的优化技巧,花相当大的代价,换来的只是很小的性能提升,而且严重降低程序的可读性
只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率
原帖由 JohnBull 于 2008-11-12 23:22 发表
我有一个办法,写程序的时候,桌子上放一些小细绳,把左手的手指分别定义成锁、互斥量、堆空间...
加锁、锁互斥量、分配堆的时候,在口曲纸上写上变量名,用绳子系在相应的手指上,解锁、解锁互斥量、释放堆的 ...
原帖由 雨过白鹭洲 于 2008-11-12 23:05 发表
我写代码从不把效率放在第一位,特别是所谓的优化技巧,花相当大的代价,换来的只是很小的性能提升,而且严重降低程序的可读性
只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率
原帖由 雨过白鹭洲 于 2008-11-12 23:05 发表
我写代码从不把效率放在第一位,特别是所谓的优化技巧,花相当大的代价,换来的只是很小的性能提升,而且严重降低程序的可读性
只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率
原帖由 smzgl 于 2008-11-13 20:15 发表
摆脱,睁大眼睛看,我写的是
strcpy(buf, str);
buf[strlen(str)] = '\0'
看清楚了,不是buf[strlen(buf)] = '\0'
strlen是查找\0的,但是strcpy并没有把\0写入buf之中,何来重复而言.
strncpy仅在当源 ...
原帖由 smzgl 于 2008-11-13 20:15 发表
摆脱,睁大眼睛看,我写的是
strcpy(buf, str);
buf[strlen(str)] = '\0'
看清楚了,不是buf[strlen(buf)] = '\0'
strlen是查找\0的,但是strcpy并没有把\0写入buf之中,何来重复而言.
strncpy仅在当源 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |