唉,这个实在没啥意思,估计大家都写过,自然也都会。不过偶的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) |