C++ if(false==条件)。为什么?

C++ if(false==条件)。为什么?,c++,C++,我收到了一些早期开发人员的代码,其中包含很多行,如 while(false==find && false == err && k<kmax) if(true==refract(ep1,ep2,n1,RI_blood, RI_collagen)) >(false==查找& & false=Er& & k:P>)它是C++中赋值的一种安全防护。 在C++中,做这个/p>完全合法。 if (foo = true) .... 在这种情况下,单个=是一个赋值,将

我收到了一些早期开发人员的代码,其中包含很多行,如

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

<代码> >(false==查找& & false=Er& & k:P>)它是C++中赋值的一种安全防护。 在C++中,做这个/p>完全合法。
if (foo = true) ....
在这种情况下,单个
=
是一个赋值,将替换
foo
的值

这是不合法的,将生成编译器错误

if (true = foo) ....

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

if(foo == bar)
作为:


第二个可能看起来有效…但会无声地敲击
foo
。如果
foo
是一个常量,则不再可能出现此错误。

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

对于my来说,这是唯一不好的样式

if(false == (ret_s<0))

if(false==(ret_s也许最初的程序员认为与true或false的显式比较比
if(condition)
if(!condition)
更清晰,并以这种方式编码。然而,我以前从未见过这种特殊的风格

这很主观,但我发现
而(!find&&!err&&k
这是一种常见的编程风格吗

没有

我难道不明白这其中的道理吗

有些人喜欢显式地将布尔值与
true
false
进行比较,即使结果是完全相同的布尔值。其逻辑可能是,通过使代码更难阅读和更令人惊讶,人们会更仔细地思考它,并对其行为做出更少的假设。或者,可能只是代码是应该很难维护,因为它很难写

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

将这两种行为结合在一起会产生你发布的奇怪代码

或者这只是一种糟糕的风格

这是一种风格。我不是风格的评判者,但如果你想让维护程序员保持警觉,它肯定会做到。就个人而言,我希望我的代码可读,但那只是我自己

我最喜欢的台词是

if(false == (ret_s<0))

我曾经遇到过用大约十行代码实现的
返回a&&!b
,第一行是
开关(a)

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

Yoda条件

使用
if(constant==variable)
而不是
if(variable==constant)
,就像
if(4==foo)
。因为这就像说“如果天空是蓝色的”或“如果人是高的”。

如果(!条件)
也一样。与false==完全一样,只是更容易阅读。
if(foo)有什么问题吗
?你不能给
true
false
赋值,因此如果
=
错误地替换
=
,如果
true
false
排在第一位,就会产生语法错误。这可能是一些程序员的一种习惯/困扰(或者他们死死地遵守一些“编码标准”),所以即使表单没有意义,他们也会使用它。当然,您不能将任何内容分配给
(ret_编译器警告使用
=
而不是
=
,因此我认为没有理由混淆它。似乎写这篇文章的人不知道
@RobertHarvey,但没有必要与
真的
假的
进行比较。基本上没有理由提醒用户cod的作者我不知道他们在做什么。这是一个相当好的红旗。这被称为“尤达代码”,正好相反。是的,对不起。我在用c#思考,对不起,在c#中仍然是相反的。是的,应该是if(!(同样,如果ret#s是一个floatdoublefalse==(ret_s=0
。如果它是IEEE NaN,第一个是
true
,第二个是
false
+1对于
个人来说,我喜欢我的代码可读,但那只是我自己。
写起来很难,读起来应该很难!+1,尽管我认为这更像是一种求助。“我不确定我在这里做什么,请尽最大努力对待我的代码”。我是风格的评判者,这是不好的。;)我喜欢尤达条件,因为它们表达了条件的意图。如果一个人忘记了一个
=
,你会得到表达式
(5=计数)
这将导致错误。但是如果使用符号
(变量==常量)
您将得到一个赋值
count=5
。而且这种语义错误更难调试。有关这方面的详细信息,请参阅此处:
if(false == (ret_s<0))
if(!(ret_s<0))