27

我收到了早期工作人员的代码,其中包含很多行,例如

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),因为这不是关于意外分配而是关于混淆的 if 子句......

4

8 回答 8

59

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

不。

我不明白其中的原因吗?

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

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

将这两种行为结合起来会产生您发布的奇怪代码。

或者这只是糟糕的风格?

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

我最喜欢的台词是

我曾经遇到过return a && !b用大约十行代码实现的。第一行是switch(a).

于 2013-06-03T20:27:26.913 回答
42

尤达条件

在此处输入图像描述
使用if(constant == variable)代替if(variable == constant),如if(4 == foo)。因为这就像说“如果天空是蓝色的”或“如果男人是高的”。

于 2013-06-03T23:14:33.083 回答
16

它是防止 C++ 赋值的安全措施。

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

if (foo = true) ....

在这种情况下,single=是一个赋值,将替换 的值foo

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

if (true = foo) ....
于 2013-06-03T20:20:46.477 回答
6

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

if(foo == bar)

作为:

if(foo = bar)

第二个可能看起来有效......但默默地破坏了foo。如果foo是常数,则不再可能出现此错误。

于 2013-06-03T20:22:08.940 回答
4

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

于 2013-06-03T20:22:51.420 回答
4

也许最初的程序员认为对真或假的显式比较比if(condition)or更清楚,if(!condition)并以这种方式编码。然而,我以前从未见过这种特殊的风格。

这很主观,但我觉得while(!find && !err && k<kmax)更容易阅读。

于 2013-06-03T20:24:27.257 回答
1

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

于 2013-06-03T23:05:02.937 回答
-1

因为我的风格很糟糕,

if(false == (ret_s<0))

在 C# 中等于

if(!(ret_s<0))
于 2013-06-03T20:23:40.090 回答