如果(假==条件)。为什么?

时间:2013-06-03 20:19:53

标签: c++

我收到了之前工作过的人的代码,它包含很多行,比如

while(false==find && false == err && k<kmax)
if(true==refract(ep1,ep2,n1,RI_blood, RI_collagen))

我最喜欢的一行是

if(false == (ret_s<0))

其他代码做得非常好,记录得很好,但这些奇怪条件下的这些线条让我失望了,我想知道为什么他们这样做了。

尤其是false==(ret_s<0)完全令人困惑,您需要阅读该行三次以了解他们想要的内容。

这是一种常见的编程风格,难道我不理解其中的推理,或者只是那种糟糕的风格?

编辑:我觉得这与if(object == NULL)vs if(NULL == object)类似,因为这不是关于意外分配,而是关于obfuscated if子句......

8 个答案:

答案 0 :(得分:56)

  

这是一种常见的编程风格吗?

没有

  

我不明白这个原因吗?

有些人喜欢明确地将布尔值与truefalse进行比较,即使结果与布尔值完全相同。大概是这样的逻辑:通过使代码更难以阅读并且更令人惊讶,人们会更加思考它并对其行为做出更少的假设。或许只是代码应该很难维护,因为它很难写。

其他人喜欢向后编写与常量的比较,这可以防止if (x = 5)出现if (x == 5)时的错误。任何现代编译器都会警告你这个错误,所以它的唯一真正目的是使代码更难阅读。

将这两种行为结合起来可以得到您发布的奇怪代码。

  

或者这只是不好的风格?

这是一种风格。我不是风格的判断,但是如果你想让维护程序员保持警惕,那肯定会这样做。就个人而言,我喜欢我的代码是可读的,但那只是我。

  

我最喜欢的一行是

我曾经在大约十行代码中遇到return a && !b。第一行是switch(a)

答案 1 :(得分:37)

尤达条件

enter image description here
使用if(constant == variable)代替if(variable == constant),例如if(4 == foo)。因为它就像是说“如果蓝色是天空”或“如果高大就是男人”。

答案 2 :(得分:16)

它可以安全地防止C ++中的赋值。

在C ++中,这样做是完全合法的

if (foo = true) ....

在这种情况下,单个=是一项分配,将替换foo的值。

这不合法,会产生编译错误

if (true = foo) ....

答案 3 :(得分:6)

常量和文字通常放在左侧,因为它可以防止意外分配。考虑输入:

if(foo == bar)

为:

if(foo = bar)

第二个似乎可行......但是默默地咒骂foo。如果foo是常量,则此错误不再可能。

答案 4 :(得分:4)

这是一种自我保护技术,可以防止您意外地键入赋值运算符(=)而不是等于运算符(==),这可能会引入奇怪的错误。将常量值放在左侧会引入编译器错误,而在LHS上放置一个变量只会静默编译。

答案 5 :(得分:4)

也许原始程序员认为明确比较真或假比if(condition)if(!condition)更明确,并以这种方式编码。然而,我之前没有见过这种特殊的风格。

这是非常主观的,但我发现while(!find && !err && k<kmax)更容易阅读。

答案 6 :(得分:1)

代码可能是为商店编写的,其中有一个站点标准,每个条件语句必须包含一个比较运算符,以避免意外遗漏部分比较。 (也许这是一个延伸,但你确实说其余的代码非常好。)那,加上标准或习惯将常量放在左边以避免意外使用=而不是==会给出相当多的你展示的代码。但是,它没有解释使用'假'而不是更自然的'真'。也许它是(在多个级别上误导)尝试通过在机器级别与零而不是1进行比较来获得微效率。

答案 7 :(得分:-1)

因为我的风格很差,

if(false == (ret_s<0))

等于C#

if(!(ret_s<0))