有条件算子的访谈问题

时间:2010-03-17 18:03:57

标签: c++ c conditional-operator

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

给出的提示是我们可以使用简单的比较,而不是使用条件运算符,它可以正常工作

我不确定,但我认为有可能通过一些GCC扩展,尽管我自己无法弄明白。

编辑:整个表达方式如下:s-=s>73?61:60

7 个答案:

答案 0 :(得分:15)

就像其他答案一样:

s -= (s > 73) + 60;

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

  

每个运营商 < (小于), > (大于), <= < / strong>(小于或等于), >= (大于或等于)如果指定的关系是 1 如果为false,则为true, 0 。结果的类型为 int

答案 1 :(得分:8)

如何减少此表达式: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;
}

多田!一段难看的难以维护的代码被简化为可读且可维护的代码块。

答案 2 :(得分:4)

这是一段如此丑陋的代码,我无法相信我写的,但我认为它符合要求:

我对s>5?6:9原始问题的回答:

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

重写了更新后的问题:

61 - (int)(s > 73)

答案 3 :(得分:2)

也许这个?

60 + !!(s > 73)

双重爆炸将非零值映射为1,零映射为零。

答案 4 :(得分:0)

(s>5)的价值是多少?你可以做一些算术吗?

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

答案 5 :(得分:0)

如果我们假设True = 1False = 0,那么这不起作用:

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

答案 6 :(得分:0)

可以认为是s - =(s> 73)+ 60>&gt;是一个关系运算符,它将返回1或0,具体取决于表达式的结果s&gt; 73,因为返回值是int所以它可以正常工作