【问题标题】:Refusing to use <= in C [closed]拒绝在 C 中使用 <= [关闭]
【发布时间】:2014-07-07 23:38:19
【问题描述】:

我在 C(和许多其他语言)中有这个习惯,而不是 foo &lt;= bar,我会使用 foo &lt; bar + 1,甚至不知道这是从哪里来的......

这本身很糟糕,还是只是不标准?我的意思是从编码和后来修改代码的上下文来看...我假设任何好的编译器都可以编译它们。

【问题讨论】:

  • 这在各种方面都被破坏了,尤其是在边缘情况、有符号/无符号和(显然)有浮点的情况下。
  • 重载运算符的行为可能会有所不同?
  • 还有其他人需要处理该代码吗?帮他们一个忙,不要那样做。
  • 似乎没有其他人提到它,所以我会 - 它也更慢。假设 bar 不是一个常数,程序将必须检索 bar 的值,将其加一,然后检查 foo 是否小于这个总和。另一方面,小于或等于运算符具有可以执行检查的单个 CPU 指令。它还节省了寄存器的使用,这可以再次提高编程速度,因为现在有一个额外的寄存器可用。您是否在重要的地方编写任何程序是另一回事。但事实仍然存在 - 它更慢。
  • 谢谢。即使我不编写任何重要的东西,速度确实很有趣。看看我最近的另一个问题stackoverflow.com/questions/24620593/… ...这也是关于速度

标签: c syntax convention


【解决方案1】:

这很糟糕,原因有很多:

  • 不适用于浮点数
  • 不适用于签名数字(-2.5 &lt;= -3 为假,但-2.5 &lt; -3 + 1 为真)
  • 使您的代码难以理解
  • 增加您(不必要地)创建溢出错误的机会

这是不好的不标准。真的没有理由继续强化这个习惯 - 你只是在为你以后的编码生涯开枪。

【讨论】:

  • 很难破解。我记得曾经读过一本书,它有助于防止发生循环迭代次数的错误。
  • 真的很快就弹出了大约 100 个文件并修复了它。希望我知道一些正则表达式来做到这一点......
  • 您可以尝试正则表达式&lt; ?-?[0-9]+ ?\+ ?1。这将按顺序查找:&lt;、可选空格、可选-、任何非零位数、可选空格、+、可选空格和1。跨度>
【解决方案2】:

我个人认为不太清楚。如果 foo 和 bar 不是整数也可能很糟糕;例如,如果 foo= -7 和 bar = -7.5,这两个将意味着不同。

【讨论】:

  • 在阅读了这篇文章和我帖子中的 cmets 之后,确实觉得这是一件很奇怪的事情,但我不知道为什么我什至开始这样做。你建议使用常规的&gt;=&lt;=,而不是我的复杂方法?
  • 是的,否则它们将不存在
【解决方案3】:

根据您的评论:

它有助于防止发生循环迭代次数的错误

您最有可能指的是以下两种方式的循环:

方法一:

for(int i = 0; i &lt; length; i++){ // } 介于 0 和 length-1 之间。 对战:

方法二:

for(int i = 0; i &lt;= length-1; i++){ //} 也在 0 和 length-1 之间。

在这些特殊情况下,任何一种都可以,但正如 Derek Redfern 在上面的回答中概述的那样,不要让您的代码变得比应有的复杂。

【讨论】:

    【解决方案4】:

    它很坏,尤其是当你这样做的时候

    int foo = <whatever>;
    int bar = INT_MAX;
    if (foo < bar + 1) {
      /* guaranteed to never be called */
    }
    

    另外,如果你以其他方式“调整”它,它可能会损坏,就像这样

    int foo = INT_MIN;
    int bar = <whatever>;
    if (foo - 1 < bar ) {
      /* again guaranteed never to be called */
    }
    

    简而言之,检查等于和大于(或等于和小于)比创建在比较期间调整值的代码要好得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多