【问题标题】:Any differences between ( var > x) and ( x < var)?( var > x) 和 ( x < var) 之间有什么区别?
【发布时间】:2023-03-27 18:50:01
【问题描述】:

我已经看到嵌入式编程以相反的顺序使用条件,例如在条件检查中左侧而不是右侧的文字。

( var > 0) and ( 0 < var) 

这是有原因的吗?还是只是一种编码风格?

谢谢

编辑:感谢大家回答并消除我的疑问。

【问题讨论】:

  • 其实并没有改变语义(如果&lt;&gt;是对称实现的)。我(几十年前)读过有关“防御性”编程的文章,它有助于更​​轻松地发现拼写错误和编程错误。从这个意义上说,后者更具防御性。 (不幸的是,我忘记了真正的原因。)
  • 编码风格(在理智的世界中,operator 可以以不同的方式实现)。但从理解的角度来看,第一个更可取。
  • === 相比更有意义。想象一下,你在一个条件下混淆了:var = 0 而不是var == 0 在语法上是正确的。 0 = var 而不是 0 == var 会导致编译器错误。 (= 左侧的非左值)
  • 看看各自的底层汇编/机器代码是什么会很有趣;也许它会是一样的。
  • 那被用作“防御性编程”。事实上,你可以比较好(var == 0)或做错(var = 0)。在第二种情况下,您为 var 赋值为零,这很难调试。如果替换为 (0 = var),则会产生编译错误,并且更易于调试。

标签: c++ coding-style


【解决方案1】:

它们是等价的。唯一的区别可能是 operator&lt;/&gt; 是否被重载,并且这些重载具有不同的含义(但不鼓励)。

我见过有人为相等运算符这样做,以避免错误地使用赋值。所以不要这样:

if (a==0) ...

写错了:

if (a=0) ... // compiles, and not what we wanted, a assigned to zero, and "if" never taken

如果我们改为使用反向比较:

if (0==a) ...

那么错误的版本不编译:

if (0=a) ... // doesn't compile

但这在今天并不太重要,因为大多数编译器会将warn 你换成if (a=0)

正如 Max Langhof 所说,这种颠倒的条件称为Yoda conditions,因为它的顺序与正常的英文顺序不同。

【讨论】:

  • 这个0 == a表格也叫Yoda conditions,因为它的顺序与普通的英文表格不同。
  • @MaxLanghof:很好的信息,我会把它添加到我的答案中。
【解决方案2】:

这只是个人口味。好吧,有些人争辩说,在比较相等性时,文字应该始终位于左侧,以免意外分配出现编译器错误:

意图:

if(x == 42) // ...

错字:

if(x = 42) // ... most likely a warning

编译错误:

if(42 = x) // ...

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 2019-09-21
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2011-06-01
    • 2018-09-25
    相关资源
    最近更新 更多