Если / Остальные утверждения или уравнения?

Вообще ли лучше использовать операторы if или уравнения при работе с булевыми значениями? Пожалуйста, ответьте на следующие вопросы, помня, что ваш ответ должен относиться к большинству, если не ко всему коду:

  1. Что быстрее и почему? Или разница слишком мала, чтобы быть существенной?
  2. Один из них более динамичный? Есть ли причина, по которой один из них может не соответствовать другому в определенных сценариях?
  3. Какой код лучше / предпочтительнее, или практика полностью основана на мнении?

(Я имею в виду C ++, но, поскольку этот вопрос является полуграничным, ссылки или сравнения с другими языками также приветствуются.)

Учитывая следующий широкий сценарий,

int n = (anything);
bool x_not_y = (declared as random boolean value);

И цель состоит в том, чтобы сделать int x = n если x_not_y это правда и int y = n вместо этого лучше использовать оператор if / else:

if (x_not_y)
x = 5;
else
y = 5;

(стенография ниже)

x_not_y?x = 5:y = 5;

или использовать уравнение?

x = (x * (int)!x_not_y) + (5 * (int)x_not_y);
y = (y * (int)x_not_y) + (5 * (int)!x_not_y);

0

Решение

Что быстрее и почему? Или разница слишком мала, чтобы быть существенной?

Я сомневаюсь, что такой код будет иметь значение для современных оптимизаторов, но если вы хотите знать, мы сначала должны спросить, Какая платформа, какой компилятор?, и тогда мы должны были бы измерить.

Является ли один из них более динамичным? Есть ли причина, по которой один из них может не соответствовать другому в определенных сценариях?

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

Какой код лучше / предпочтительнее, или практика полностью основана на мнении?

Со временем я обнаружил, что все больше склоняюсь к функциональной парадигме. Мне нравится выражать ветки через структуру кода лучше, чем через значения переменных, я предпочитаю конфисковать как можно больше (даже локальные переменные).

Я особенно научился не любить такой код:

int x;
if( some_condition )
x = 5;
else
x = 42;

Чтобы понять, что делает такой код, нужно отслеживать значения каждой переменной и следовать каждому утверждению. Также, x не может быть const здесь, что я считаю недостатком строки.

Я сильно предпочитаю

const int x = calc_x(some_condition);

который в таких простых случаях, как этот пример, можно записать в виде

const int x = some_condition ? 5 : 42;

Сейчас x может быть const (позволяя компилятору предотвратить непреднамеренное выполнение глупостей), фрагмент кода, реализующий алгоритм, который выясняет, что x должен иметь имя (calc_x()), а не имея алгоритм inlineТеперь в коде только это имя.

Конечно, этот код настолько прост, что ему не нужны те преимущества, которые я перечисляю, но когда вы имеете дело с более сложным реальным кодом, я обнаружил, что в долгосрочной перспективе более функциональный подход будет лучше ,

7

Другие решения

Ваши два примера делают две разные вещи:

Оператор IF меняет x или y, оставляя другой без изменений.

Ваше уравнение меняет оба х & y, устанавливая единицу в значение 5 а другой к 0,

Тем не менее, утверждение if может подвергнуться штрафу за неправильное прогнозирование ветки, в отличие от второй формы (за счет трудностей чтения).

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector