Вообще ли лучше использовать операторы if или уравнения при работе с булевыми значениями? Пожалуйста, ответьте на следующие вопросы, помня, что ваш ответ должен относиться к большинству, если не ко всему коду:
(Я имею в виду 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);
Что быстрее и почему? Или разница слишком мала, чтобы быть существенной?
Я сомневаюсь, что такой код будет иметь значение для современных оптимизаторов, но если вы хотите знать, мы сначала должны спросить, Какая платформа, какой компилятор?, и тогда мы должны были бы измерить.
Является ли один из них более динамичным? Есть ли причина, по которой один из них может не соответствовать другому в определенных сценариях?
Поскольку я считаю, что оптимизатор вашего компилятора может одинаково справляться со всеми из них, я бы предложил написать код, который легко понять и поддерживать, и заниматься оптимизацией только после того, как измерение покажет, что это горячая точка.
Какой код лучше / предпочтительнее, или практика полностью основана на мнении?
Со временем я обнаружил, что все больше склоняюсь к функциональной парадигме. Мне нравится выражать ветки через структуру кода лучше, чем через значения переменных, я предпочитаю конфисковать как можно больше (даже локальные переменные).
Я особенно научился не любить такой код:
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
Теперь в коде только это имя.
Конечно, этот код настолько прост, что ему не нужны те преимущества, которые я перечисляю, но когда вы имеете дело с более сложным реальным кодом, я обнаружил, что в долгосрочной перспективе более функциональный подход будет лучше ,
Ваши два примера делают две разные вещи:
Оператор IF меняет x или y, оставляя другой без изменений.
Ваше уравнение меняет оба х & y, устанавливая единицу в значение 5
а другой к 0
,
Тем не менее, утверждение if может подвергнуться штрафу за неправильное прогнозирование ветки, в отличие от второй формы (за счет трудностей чтения).