zhangJW_cn 阅读(798) 评论(13)
    其实,是一个很简单的错误。只要稍微用心点,就不会发生,可是我就偏偏发生了,而且好像这是第二次。
    我是需要x和x_last不同时,doSomeThing(),直到x和x_last一致。因为觉得if看起来不舒服,结果写了以下愚蠢的代码:
    while( x < x_last-- ) doSomeThing();
    while( x > x_last++ ) doSomeThing();
初看,自己真的没觉得有什么错,可惜的就是x_last--会执行到x == x_last了,还x_last--一次,从而,我那可怜的x > x_last ++也被判断了,还doSomeThing()了一次。
    还是不喜欢if(顺便,个人不觉得这里有什么实际的效率损失),改为了以下形式:
    while( x < x_last )
    {
        x_last--;
        doSomeThing();
    }
    while( x > x_last )
    {
        x_last++;
        doSomeThing();
    }
    下次,如果有人打算把类似第二个while的方法,简写为第一个while时,要小心了哦(俺就是想把第二个简写为第一个,而且觉得加上if else 难看,所以,犯了这个错误两次,第一次找出来了,结果等了几个月后,居然又误入歧途。呵呵,俺下次就会高度重视了!)。

评论列表
乾坤一笑
re: 我犯的一个很愚蠢的错误,当时还以为没错
LZ的代码也写的太晦涩了(又不是搞源码加密),BS一下,嘿嘿。

#include <stdio.h>

int x=0, x_last=5;

void doSomeThing()
{
    printf("doSomeThing: x: %d  x_last: %d\n", x, x_last);
}

void printStatus()
{
    printf("    printStatus: x: %d  x_last: %d\n", x, x_last);
}

int main(int argc, char *argv[])
{
/*  
    ///// your code
	while(printStatus(),x<x_last--) 
        doSomeThing();
     printf("main: x: %d  x_last: %d\n", x, x_last);
	while( x > x_last++ ) 
        doSomeThing();
*/
    ///// my code
    int flag = x > x_last ? 1 : -1;
    /*
    while( printStatus(), x!=x_last ) 
        x_last+=flag, doSomeThing();
    */
    while( x!=x_last ) 
        x_last+=flag, doSomeThing();
	return 0;
}
乾坤一笑
re: 我犯的一个很愚蠢的错误,当时还以为没错
自偶点评一下:"需要x和x_last不同时,doSomeThing(),直到x和x_last一致" 所以就要判断“x!=x_last”或者“x<x_last || x>x_last”,把这种原子判断条件分成两部分来写,一方面会产生隐讳的逻辑错误,另一方面则对别人读代码造成极为严重的障碍。(汗!最近偶好像特自恋,老搞自偶崇拜,BS自己一下!)
清风雨
re: 乾坤一笑
我以前应该也看到过类似的做法。

你这种方式好,确实应该先设立一个方向flag,然后同意逻辑处理。

我那个逻辑上本身就不独立,不过,贴出来,主要是引以为诫,告诫自己:不要为了所谓的书写优美或循环优化等而引入了错误,就这里,就是要特别注意我喜欢简写的++/--的问题了。
清风雨
re: 乾坤一笑
还有一个问题就是,个人从某个时候起,习惯了范围匹配,而不是精确匹配。
比如,如果精确匹配,遇到浮点时,就要小心了哦。

另外,范围的好处就是,万一软件发生故障,根据范围还能处理。也就相当于添加了一定的自我修复能力或加强了健壮性。
乾坤一笑
to 清风雨 :
还有一个问题就是,个人从某个时候起,习惯了范围匹配,而不是精确匹配。
比如,如果精确匹配,遇到浮点时,就要小心了哦。
-----
杀鸡用鸡刀,杀牛用牛刀。这个理由找的可真不高明!:)
清风雨
re: 乾坤一笑
先:呵呵,一笑以为我是在为自己找借口。哈哈!

然:“直到x和x_last一致”是后来我从while总结来的,开始的实际还是x < x_last时要如何,x > x_last时要如何。个人很多时候觉得一句话很可能影响程序当时的写法。(如果,这个也觉得是借口,哈哈,那就借口好了。:})当然,如果是另一种同样问题的更好方法已经注意,那么一般情况也是会大脑优选的,也不会出现while1和while2。

感觉有点不实在说技术了。:}不过,还好,里面有两句有意义的话。
清风雨
re: 老梆菜
杨老师的文章粗略阅过。不过,对我可能实质帮助不大:},所以,也没有细看,只是看了个大概。
但,不论怎么说吧,还是很高兴能看到杨老师的文章连接于此。
清风雨
就精确匹配
又看了一下。

个人习惯不好,在一个问题未完时,又出另题。

不过,看到的朋友,如果有可能,可以考虑范围匹配代替精确匹配的哦,不仅仅是浮点运算。他会给你带来好多好处的,一般来说好处大于害处。
当然,凡事都要因具体问题而议了,如果你觉得有更多理由,不屑于如此,那也不必如此。
乾坤一笑
re: 我犯的一个很愚蠢的错误,当时还以为没错
"范围匹配代替精确匹配"说的可是如float型和0.0比较不能直接比的问题?比如f!=0.0要写成 f<-0.0001 && f >0.0001的问题?
偶就知道你要这样讲,所以偶写了“ 所以就要判断“x!=x_last”或者“x<x_last || x>x_last”,” 而不是仅仅写了只能x!=x_last。 嘿嘿嘿嘿。
清风雨
re: 乾坤一笑
不是的,我说范围匹配不是就你的说法说的。
是说我当时放这个错误的一个潜在原因和下意识。后来,觉得范围匹配有很多好处,相对精确匹配而言,所以,顺便强盗了一下。

范围匹配也不限于浮点,那个其实也是个“精度匹配”的问题。范围匹配的一个基本好处,是可以预防错误,防止调试时遗漏的意外,保护软件。

呵呵,你的问题,我其实本来写的也是int,还一直没注意你把我x看成float的,如果float了,呵呵,还真的不能 x != x_last(除非它觉得玩起来很happy);还有,如果float,我也不能++/--的,呵呵,没必要那么特意的。

俺向来认为凡事在神而不在形,虽然,俺喜欢比较艺术一点的文字(我觉得这个是文字的神的一种表现,不扯远了)。
清风雨
我的上一贴
shit,别字真多。
是 强调 不是 强盗。
hengai
re: 我犯的一个很愚蠢的错误,当时还以为没错
我还是倾向于先判断两者的大小,然后使用while循环比对

发表评论
切换编辑模式