【问题标题】:An interview question on conditional operator一个关于条件运算符的面试题
【发布时间】:2011-01-28 17:03:14
【问题描述】:

我最近遇到这个问题:如何减少这个表达式:s>73?61:60;

给出的提示是,我们可以使用简单的比较来代替条件运算符,这样可以正常工作

我不确定,但我认为可以使用一些 GCC 扩展,尽管我自己无法弄清楚。

编辑:整个表达式是这样的:s-=s>73?61:60

【问题讨论】:

  • 你不想为面试时问这类问题的人工作。
  • 正确答案是“去别的地方面试,问一些有价值的问题”
  • @AraK,只有那些不了解工作面试的人。
  • @AraK: 是的,有些面试官完全被自己的智慧惊呆了,他们告诉自己,他们只希望雇佣足够聪明的人来回答他们晦涩无用的琐事问题,但实际上他们只是想给可怜的受访者留下多么聪明的印象
  • 仅供参考:在 x86-64 上使用 -O3 在 gcc 4.2.1 中编译 Carl 的答案和三元运算符,两者都得到相同的程序集。没有 -O3 (因此正常运行),卡尔的答案会变小。但是,为什么要发布不是 -O3 的版本,尤其是在速度是问题的情况下?

标签: c++ c conditional-operator


【解决方案1】:

这是一段丑陋的代码,我不敢相信我写了它,但我认为它满足了要求:

我对@9​​87654321@的原始问题的回答:

9 - (((int)(s > 5)) * 3)

为更新的问题重写:

61 - (int)(s > 73)

【讨论】:

    【解决方案2】:

    (s>5) 的值是多少?你能用它做一些算术吗?

    如果没有提示,我会说这是一个糟糕的“陷阱”面试问题,需要与能力无关的特定洞察力。有了提示,它... 不错,但暗淡

    【讨论】:

      【解决方案3】:

      就像其他答案一样:

      s -= (s > 73) + 60;
      

      此表达式有效,因为规范定义了关系运算符的结果。第 6.5.8 节第 6 段:

      每个运算符 <(小于)、>(大于)、<=(小于或等于),如果指定的关系为真且 0强>如果它是假的。结果的类型为 int

      【讨论】:

      • 对于一个糟糕的问题,这是一个优雅的解决方案;)
      • 这也适用于 C++,比较的结果是 bool,其中 + 提升整数操作数,而 bool 提升为 01 for @分别为 987654334@ 和 true。 (假设s 是一个普通的int 而不是某个类)。
      • 是的,但实际上是减少吗? :D 我们必须看看 asm,不是吗? ;)
      【解决方案4】:

      也许是这个?

      60 + !!(s > 73)
      

      双键将非零值映射到 1 并将零值映射到零。

      【讨论】:

      • 您不需要这样做,规范保证关系运算符返回 1 或 0。第 6.5.8 节第 6 段。
      【解决方案5】:

      如果我们假设True = 1False = 0,那么这行不通:

      s-= (60 + (s > 73))
      

      【讨论】:

        【解决方案6】:

        如何减少这个表达式:s-=s>73?61:60;

        怎么样:

        typedef int Price;
        Price getPriceAfterRebate(const Price priceBeforeRebate)
        {
          const Price normalRebate = 60;
          const Price superRebate = 61;
        
          const Price superRebateThreshold = 73;
        
          Price returnValue = priceBeforeRebate;
          if (priceBeforeRebate > superRebateThreshold)
          {
            returnValue -= superRebate;
          }
          else
          {
            returnValue -= normalRebate;
          }
          return returnValue;
        }
        

        多田!一段丑陋的不可维护的代码被简化为可读且可维护的代码块。

        【讨论】:

        • @Ari, litb:很高兴你喜欢它。
        【解决方案7】:

        可以认为 s -= (s > 73) + 60 因为 > 是一个关系运算符,它会根据表达式 s > 73 的结果返回 1 或 0 ,因为返回值是 int 所以它会工作正常

        【讨论】:

          猜你喜欢
          • 2013-03-31
          • 2020-10-17
          • 1970-01-01
          • 2011-06-13
          • 2013-09-10
          • 1970-01-01
          • 2010-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多