Вопрос интервью об условном операторе - PullRequest
2 голосов
/ 17 марта 2010

Недавно я столкнулся с этим вопросом: как уменьшить это выражение: s> 73? 61: 60; .

Подсказка состояла в том, что Вместо условного оператора мы могли бы использовать простое сравнение, которое будет прекрасно работать .

Я не уверен, но думаю, что это возможно с некоторым расширением GCC, хотя я сам не могу понять это.

РЕДАКТИРОВАТЬ: полное выражение это: s-=s>73?61:60

Ответы [ 7 ]

15 голосов
/ 17 марта 2010

Как и другие ответы:

s -= (s > 73) + 60;

Это выражение работает, потому что спецификация определяет результаты реляционных операторов. Раздел 6.5.8, пункт 6:

Каждый из операторов < (меньше чем), > (больше чем), <= (меньше или равно ) и >= (больше или равно) должны дать 1, если указанное отношение истинно, и 0, если оно ложно , Результат имеет тип int.

8 голосов
/ 17 марта 2010

Как уменьшить это выражение: 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;
}

Тада!Некрасивый кусок не поддерживаемого кода превращается в читаемый и обслуживаемый блок кода.

4 голосов
/ 17 марта 2010

Это такой уродливый кусок кода, что я не могу поверить, что я написал его, но я думаю, что он удовлетворяет требованию:

Мой ответ на оригинальный вопрос, который был s>5?6:9:

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

Переписано для обновленного вопроса:

61 - (int)(s > 73)

2 голосов
/ 17 марта 2010

Может быть, это?

60 + !!(s > 73)

Двойной удар отображает ненулевые значения в 1 и ноль в ноль.

0 голосов
/ 21 сентября 2012

Его можно представить как s - = (s> 73) + 60, так как> является оператором реляции, и он возвратит 1 или 0 в зависимости от результата выражения s> 73, поскольку возвращаемое значение равно int, поэтому оно будет отлично работает

0 голосов
/ 17 марта 2010

Если мы предположим, что True = 1 и False = 0, то это не сработает:

s-= (60 + (s > 73))
0 голосов
/ 17 марта 2010

Какое значение (s>5)? Не могли бы вы сделать арифметику с этим?

Без намека, я бы сказал, что это был плохой вопрос для собеседования, который требует особого понимания а-ха, которое не связано со способностями. С подсказкой, это ... приятно, но тускло .

...