2

我最近遇到了这个问题:How to reduce this expression: s>73?61:60; .

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

我不确定,但我认为通过一些 GCC 扩展是可能的,尽管我自己无法弄清楚。

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

4

7 回答 7

15

就像其他答案一样:

s -= (s > 73) + 60;

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

如果指定的关系为真且为假,则每个运算符<(小于)、>(大于)、<=(小于或等于)和>=(大于或等于)都应产生。结果有类型。10int

于 2010-03-17T18:11:02.100 回答
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;
}

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

于 2010-03-17T18:34:50.173 回答
4

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

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

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

为更新的问题重写:

61 - (int)(s > 73)

于 2010-03-17T18:07:13.160 回答
2

也许这个?

60 + !!(s > 73)

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

于 2010-03-17T18:12:39.570 回答
0

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

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

于 2010-03-17T18:09:55.957 回答
0

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

s-= (60 + (s > 73))
于 2010-03-17T18:14:15.417 回答
0

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

于 2012-09-21T03:46:57.647 回答