Chinaunix首页 | 论坛 | 博客
  • 博客访问: 847881
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 16:14:31

唉,这个实在没啥意思,估计大家都写过,自然也都会。不过偶的BLOG的水都快枯了,怎么办?只好班门弄斧了,每天晚上胡乱贴两句代码,招揽一下生意,欢迎大家来找茬。(特别公布上期找茬冠军: rovershen大哥^_^)

#include 
#include 

#define in_area(x, a, b) ((x)>=(a) && (x)<=(b))
#define isxdigit(x) ( isdigit(x) || in_area(x, 'a', 'f') || in_area(x, 'A', 'F') )

void print( int boolean );

int main(int argc, char *argv[])
{
    // for testing .... 
    print(isxdigit('0'));
    print(isxdigit('9'));
    print(isxdigit('5'));
    print(isxdigit('A'));
    print(isxdigit('F'));
    print(isxdigit('a'));
    print(isxdigit('f'));
    print(isxdigit('z'));
    print(isxdigit('M'));
    print(isxdigit('L'));
    return 0;
}

void print( int boolean )
{
    printf( "%s\n", boolean ? "true" : "false" );
}



-------------------VERSION HISTORY----------------------------
3-26       根据荣哥所说做了修改。


--------------------next---------------------
荣哥说的确实有些道理,我改过了。

对于原来写的in_area(x, a, b) 如果测试 !in_area( x, a, b)
这就是说,如果把原来的逻辑表达式 P && Q, 那么 !(P && Q) 和 !P && Q结果域是不是相等的呢?如果把P和Q看作集合,那么两者肯定是不相等的,画了韦恩图很容易看明白。

C语言的逻辑表达式考查不是数域,而是真值——即作用在&&或者||或者!之下的是一个值,只有true或者false两种结果(sorry,其实C语言没有布尔变量的,我这里是为了说的明白些),那么我们再看看
!(P && Q) 和 !P && Q 是不是相等的。请看下面的真值表:

P 0 0 1 1
Q 0 1 0 1
!(P && Q) 1 1 1 0
!P && Q 0 1 0 0

就是说只要Q为false,那么!(P && Q)和!P && Q 的结果一定是不同的。用代码验证一下就是:

#include
#include

#define in_area(x, a, b) ((x)>=(a)) && ((x)<=(b))

void print( int boolean );

int main(int argc, char *argv[])
{
print( !in_area('G', 'A', 'F') );
print( in_area('G', 'A', 'F') );
return 0;
}

void print( int boolean )
{
printf( "%s\n", boolean ? "true" : "false" );
}

打印的结果是:
false
false

所以,荣哥的结论是对的——原来的代码确实有bug。这个隐患不好找呀,偶们平时写代码的时候还是要严禁些。:)


--------------------next---------------------
外因的影响终究是小的,内因才起决定性作用。空气不是纯氧,社会也不是只有真善美没有假丑恶。温室的花朵经不起风雨的打击,所以被错误磨练未必不是一种进步的途径。

不能畏惧结果的质量就压抑思想的火花。Knuth在其《Sorting and Searching》一书的第6.2.1节中指出:尽管第一个二分查找程序于1946年就已经公布了,但是第一个没有bug的二分查找程序在1962年才出现。可是如果没有第一个程序,后面程序的改进有从何而来?

错误每个人都会犯的,多数不是有意而是无意。事实上,100个程序员中有90个都写不出一个没有bug的二分法程序。不信的话,你可以合上书本、切断网络、自己实现一个试试,然后把代码贴出来让大家找找茬,看看能否做到top10。

闭上眼神游总觉得自己伟大,立足小事实际做做才发现自己是多么笨拙。最可怜的人不是做错事被人指责的,而是怕做错被别人指责耻笑而不敢去做的、整天生活在精神的乌托邦中的人。:)
--------------------next---------------------

阅读(658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~