2013-12-04 4 views
0

Вопросы:

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

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

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

Пример (в C++):

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

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

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

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); 
+1

Интересный вопрос. Сначала я думал, что ответ очевиден, но теперь я хочу подождать и посмотреть, что кто-то гораздо более опытный, чем я думаю! – hammus

+3

Я рискую получить крик от преждевременных оптимистов, но ответ: «это зависит от множества вещей» – Mysticial

+1

В C++ нет «уравнений». Существуют только * утверждения *, которые включают (среди прочего) * выражения *. –

ответ

7

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

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

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

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

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

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

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

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, нет w только это имя в коде.

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

+0

Вопрос о производительности при настройке двух разных значений, учитывая одно условие. – paddy

+0

Я правильно говорю, что, избегая алгоритмов, которые являются встроенными, вы также предпочитаете, чтобы код (если возможно) был сделан в одном выражении для учета 'const''s? –

+0

@paddy: Я попытался изменить свой ответ, чтобы ответить на все три вопроса. Но на самом деле, я бы уволил первых двух в любом случае. – sbi

-1

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

The Если изменения заявление х или у, оставляя другие без изменений.

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

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

+5

Это комментарий, а не ответ – KevinDTimm

+1

Этот комментарий получает много upvotes. Я ничего не вижу, отвечая на вопрос. – paddy

+0

Этот ответ неправильный. Если переменные объявлены ранее, обратитесь к последнему биту кода. –