Вложение условных операторов в оператор возврата - PullRequest
0 голосов
/ 04 июля 2019

Поэтому я установил код, который находит величину (абсолютное значение) разницы между пользовательским вводом и 51. Если пользовательский ввод больше 51, результат утроится.Не сложно.Чтобы минимизировать сам код, я придумал это.

// Compare and determine the correct output based on program's 
// paramters:
//
// - find absolute value of input - 51
// - if input > 51 then multiply result by 3
//-----------------------------------------------------------

int calcDiff(int x) {
      const int base = 51;
      int result     = x - base;    
      return x > base ? 3*result : (result < 0 ? ~result + 1 : result);
 }

Итак, вопрос:

Это уместно?Я знаю, что это работает, но мне более любопытно, является ли это плохой практикой, и может ли кто-нибудь как-нибудь сильно укусить меня сзади.Это просто мнение, или это большое нет нет, как использовать scanf или gets?Есть ли смайлики для избиения мертвой лошади?Потому что я хотел бы использовать его.

1 Ответ

3 голосов
/ 04 июля 2019
  1. В вложенных условных выражениях нет ничего плохого в выражении return, как таковом .

  2. ~result + 1 плохо. Вы пытаетесь отрицать result. Правильный способ сделать это просто -result. ~result + 1 основывается на представлении дополнения двух, которое встречается повсеместно, но это выражение более странное и ненужное.

  3. Вам не нужно (result < 0 ? ~result + 1 : result). Это выражение вычисляется только в том случае, если x > base имеет значение false, в этом случае result должно быть меньше или равно нулю, и вы хотите вернуть -result, так как он обрабатывает оба случая, кроме нуля (return -result ) и равен нулю (верните 0, что совпадает с -result, когда result равно нулю).

Таким образом, оператор return может быть записан:

return x > base ? 3*result : -result;

или

return result > 0 ? 3*result : -result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...