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
是一个float
或double
,false==(ret_s=0
。如果它是IEEE NaN,第一个是true
,第二个是false
+1对于个人来说,我喜欢我的代码可读,但那只是我自己。
写起来很难,读起来应该很难!+1,尽管我认为这更像是一种求助。“我不确定我在这里做什么,请尽最大努力对待我的代码”。我是风格的评判者,这是不好的。;)我喜欢尤达条件,因为它们表达了条件的意图。如果一个人忘记了一个=
,你会得到表达式(5=计数)
这将导致错误。但是如果使用符号(变量==常量)
您将得到一个赋值count=5
。而且这种语义错误更难调试。有关这方面的详细信息,请参阅此处:
if(false == (ret_s<0))
if(!(ret_s<0))