我收到了之前工作过的人的代码,它包含很多行,比如
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子句......
答案 0 :(得分:56)
这是一种常见的编程风格吗?
没有
我不明白这个原因吗?
有些人喜欢明确地将布尔值与true
或false
进行比较,即使结果与布尔值完全相同。大概是这样的逻辑:通过使代码更难以阅读并且更令人惊讶,人们会更加思考它并对其行为做出更少的假设。或许只是代码应该很难维护,因为它很难写。
其他人喜欢向后编写与常量的比较,这可以防止if (x = 5)
出现if (x == 5)
时的错误。任何现代编译器都会警告你这个错误,所以它的唯一真正目的是使代码更难阅读。
将这两种行为结合起来可以得到您发布的奇怪代码。
或者这只是不好的风格?
这是一种风格。我不是风格的判断,但是如果你想让维护程序员保持警惕,那肯定会这样做。就个人而言,我喜欢我的代码是可读的,但那只是我。
我最喜欢的一行是
我曾经在大约十行代码中遇到return a && !b
。第一行是switch(a)
。
答案 1 :(得分:37)
使用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))