当前位置:C++技术网 > 资讯 > ifelse条件判断低级逻辑错误,你会不会犯?

ifelse条件判断低级逻辑错误,你会不会犯?

更新时间:2015-09-02 12:55:46浏览次数:1+次

    说起低级错误,看似低级,似乎又有很多隐情。本来我觉得算了,问题找到了,这么个低级错误,都不想总结。朋友告诉我,总结下吧。我细想一下,似乎有必要。

   
    因为我知道,平时的一些细节,看似不重要,但是又会犯错,似乎表面是低级错误,而在深层次里却是有一些地方出了问题。
    我已不是当初只停留在编程语法层面的学习,对于这种基本的语法错误,肯定不是没有掌握好而导致,既然如此,肯定是哪里出了问题。
    然后在思索的瞬间,我发现,有一个观念从脑子闪过,那就是一个节省代码的技巧。或许,跟这个有关系吧。或者,对于这些基本的逻辑问题,没有深究,或许出了问题,需要深思一番,这样在今后的开发中就会有所防范。
    做好每一个细节,方能保证程序不再出低级错误。也恰恰是一些低级错误,会导致“众里寻他千百度,那个Bug就在眼前处”,而我们却熟视无睹。我希望做好每一个细节,我希望我的程序里尽量不要出现这种低级错误,在编写代码的时候,留意每一个可能出现错误的逻辑之处,算是积累一个经验。我会在写==时想起一个误用=来判断。有时候经验是需要总结来主动积累的,如果一次次的忽略,你还会不断的犯这些小错误,看似不起眼,说不定什么时候就毁在这些小错误之上。
    我先说说一个在if else里节省代码量的小技巧。有时候,这些确实会让代码大大简化,不需要大量的代码块,写多了都分不清楚,眼花缭乱了。所以,尽量不要让花括号超过3层,否则很容易出错。那么这个小技巧可以顶一点用。不过这个低级错误也正是于此有关吧。
    if else是做条件跳转。说到这里,我似乎没有深入去想这个问题,或者说,从水平提高后,没有回头深思这些基础的东西。那么在此就多解释一下,也是我自己来做一番思考吧。
    条件跳转,也就是像你走入一个岔路口,不管你如何选择,你总有走一条路。不选择也是选择,这一句话在计算机中体现的很好。如果你只选择一个条件,那么默认不选择另外一个条件。条件选择,我们应该考虑到事情的所有真相,所有可能。事实上这个不难。要让if else管住所有可能,就是要让if else作用范围影响到后续的所有代码。否则的话,你就无法顾及所有可能。也就是说,你的if else是一道开关选择,每一种选择都不会和另一个选择汇合,否则就会出问题。而我们这个低级错误就出自于此。
    我在开始判断一个值大于5,然后没有用else。像下面这样:

if(i>5)
    // - 执行一个代码
//其他的代码

     本来if这里是一个关卡,用来分流。让不同的条件走不同的流程,而结果却是,满足条件的做了一些事情,不满足的不做这个事情,但是最终,都汇集到一起。而分流后,我应该对不同的条件做不同的处理,这里就最后没有分开处理,导致不管条件满不满足都做了一个处理,就出现了逻辑错误。
    解决方法很简单,就是使用else来处理。学了点编程的都知道。那么这个问题到底为什么会出现呢?我在挖掘我内心的想法,问题出现,必然是脑子里的思维的小Bug。调试程序,应该调试到程序员自己的内心深处。才能从根本上遏制Bug的再出生。我希望做到这点,所以才写了这个总结。你可以跟着我的思维来看这篇文章,这就是我调试自己的一个过程。思路可能并不会很条条杠杠,但是一定是我们的思维的变化过程。
    所以,忽略else,我想起了前面提到的技巧。有时候,经验多了,不加总结,就串联在一起短路了。因为大量的写if else,写多了。代码就臃肿无比。我是一个追求代码简洁的人。
    如果是全局性的分流,也就是,一个条件会执行到底,不是对一个条件下改变一个变量的一个状态。

   
    if的使用,第一种是全局的分流,就是一种条件执行一种事情,两个事情的代码完全不相干。比如选择1执行打LOL,选择else执行听歌。这两个事情,没有任何关联,只是简单的分流而已,这个是全局分流,所以,一个情况一直要作用到函数结束。
    而另一种就是状态设置。也就是说,你可以在一个程序,根据条件来设置一个变量的值,假如这个值代表性别,你可以在开始的选择中设置好性别,但是这个人在接下来的行为中,很多行为都不需要区别性别,属于公共的动作。而有时候要区别一下性别,比如上厕所。那么这种情况最好不能使用全局的分流。因为如果全局分流,那么男女共同的动作,就需要写两份代码,从而造成代码冗余。而这个时候,使用状态设置,在需要的时候再用if来区分即可。因为开始的时候已经设置了状态。
    全局分流不容易出问题,因为简单。而状态设置则需要比较仔细。但是如果你没有区分好这两种方式,结果全局分流用成了状态设置模式,也就是没有将两种情况隔绝,导致处理错误。
    说到这里,这不仅仅是语法的问题,这是一个逻辑思维的问题,对于这类问题,如果你思维清晰,就可以顺利解决,否则就很容易在这些逻辑里摔倒。我就因为这样摔倒,本来要用全局分流的,却没有分流好,后面的代码却成为了公共代码了。
    出现这个错误的一个潜在可能就是在之前代码中追求代码简洁,使用的技巧而没有多加总结,导致逻辑错误。写这个文章就是来纠正一下。
    因为前面的全局分流特点,可以让我的代码变得很简洁。因为很多时候,我们对于一些变量进行检测,如果不满足,那么就没有必要执行下去了。一般的就是使用if else来全局分流。这样如果有比较多的条件,就会让花括号满天飞。那么这个时候,我就习惯了使用将不满足而要终止的一个条件,使用return来终止。那么能够通过这个条件的,自然就是满足需要的,这样就不会出现else的写法了。而且一个比较好的做法,就是将不满足条件的情况先写,这样,不满足的代码很容易写完了。而满足条件的需要写很多代码,我们的程序要继续在这个代码块中写,那么代码块会越来越大。而固定的小片的代码,放在前面,并不会因为我们添加了新代码让小片的代码不断的往下挤。在阅读代码是,思维上的压力负担也会小,很符合心理的节奏。如果你看了一大段代码,后面有几个else,你就会有点崩溃。你要找,那个else属于那个if。这是很头痛的事情,而一开始就写了,思维随着程序的跳转在前面已经完成,在后续阅读代码的时候,不必记挂这些else了。因为你读的功能代码就是在else中。不管是显式的else,还是使用return来中断条件后在逻辑上形成的else,都是在else的逻辑里。
例如下面这样:

if(i==0)return;
i++;// - 隐含了else的i!=0这个条件。
    而不是这样:
if(i!=0)
{
    // 执行代码
    i++;
}
else
{
    return;
}

     当然这里只是简单的举例。而上面的一个不必有else。这样省掉了一些代码,看起来简洁了。但是在逻辑上,要注意好,别因为节省代码而导致逻辑错误。
    这些看似没有多大深究的东西,我们可以挖掘逻辑思维,这才是开发软件的本质。而逻辑思维,又可以应用于各种编程之上。有必要探讨,如果你发现有些逻辑问题,也可以用这种总结方式整理逻辑,也可以和大家分享。
    写作这类文章,目的在于促使你去思考,去挖掘自己的思维的潜能。逻辑思维严密是一个程序员必须具备的基本素质。