Преимущества использования условного оператора?: (Троичный) - PullRequest
100 голосов
/ 22 июля 2010

Каковы преимущества и недостатки оператора?: По сравнению со стандартным оператором if-else.Очевидные из них:

Условный?: Оператор

  • Короче и более кратко при работе с прямыми сравнениями значений и присвоениями
  • Кажется, не такой гибкий, как конструкция if / else

Стандартный If / Else

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

Кажется, что читаемость может отличаться для каждого в зависимости от оператора.Некоторое время после первого обращения к оператору?: Мне потребовалось некоторое время, чтобы разобраться, как именно это работает.Вы бы порекомендовали использовать его везде, где это возможно, или придерживаться, если / еще, учитывая, что я работаю со многими непрограммистами?

Ответы [ 17 ]

4 голосов
/ 22 июля 2010

Преимущество условного оператора заключается в том, что он является оператором.Другими словами, он возвращает значение.Поскольку if является оператором, он не может возвращать значение.

4 голосов
/ 22 июля 2010

Если я устанавливаю значение и знаю, что для этого всегда будет одна строка кода, я обычно использую троичный (условный) оператор. Если есть вероятность, что мой код и логика изменится в будущем, я использую if / else, поскольку это более понятно для других программистов.

Еще более интересный для вас может быть ?? оператор .

2 голосов
/ 23 июля 2010

Тернарный оператор может быть включен в r-значение, тогда как if-then-else не может; с другой стороны, if-then-else может выполнять циклы и другие операторы, тогда как троичный оператор может выполнять только (возможно, void) значения r.

В связанной заметке, && и || операторы допускают некоторые шаблоны выполнения, которые сложнее реализовать с помощью if-then-else. Например, если у вас есть несколько функций для вызова и вы хотите выполнить фрагмент кода, если какая-либо из них не удалась, это можно сделать с помощью оператора &&. Выполнение этого без этого оператора потребует либо избыточного кода, перехода или дополнительной переменной флага.

2 голосов
/ 23 июля 2010

Если вам нужно несколько веток в одном и том же условии, используйте if:

if (A == 6)
  f(1, 2, 3);
else
  f(4, 5, 6);

Если вам нужно несколько веток с разными условиями, то если число операторов будет снежным комом, вы захотите использовать троичную:

f( (A == 6)? 1: 4, (B == 6)? 2: 5, (C == 6)? 3: 6 );

Кроме того, вы можете использовать троичный оператор при инициализации.

const int i = (A == 6)? 1 : 4;

Делать это с помощью if очень грязно:

int i_temp;
if (A == 6)
   i_temp = 1;
else
   i_temp = 4;
const int i = i_temp;

Вы можете 't поместить инициализацию внутри if / else, потому что это меняет область видимости.Но ссылки и константные переменные могут быть связаны только при инициализации.

2 голосов
/ 23 июля 2010

Существует некоторое преимущество в производительности при использовании?оператор в например.MS Visual C ++, но это действительно специфичная для компилятора вещь.В некоторых случаях компилятор может оптимизировать условную ветвь.

2 голосов
/ 23 июля 2010

Сценарий, который я чаще всего использую, предназначен для значений по умолчанию, особенно для возвращаемых значений

return someIndex < maxIndex ? someIndex : maxIndex;

Это действительно единственные места, которые мне нравятся, но для них я делаю.

Хотя, если вы ищете логическое значение, иногда это может выглядеть уместно:

bool hey = whatever < whatever_else ? true : false;

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

bool hey = (whatever < whatever_else);
1 голос
/ 04 июня 2018

С C # 7 вы можете использовать новую функцию ref locals , чтобы упростить условное присвоение ref-совместимых переменных.Так что теперь вы можете не только сделать:

int i = 0;

T b = default(T), c = default(T);

// initialization of C#7 'ref-local' variable using a conditional r-value⁽¹⁾

ref T a = ref (i == 0 ? ref b : ref c);

... но и чрезвычайно удивительно:

// assignment of l-value⁽²⁾ conditioned by C#7 'ref-locals'

(i == 0 ? ref b : ref c) = a;

Эта строка кода присваивает значение a любому b или c, в зависимости от значения i.



Примечания
1. r-значение - это правая сторона назначения, значение, которое присваивается.
2. l-значение - это слева - сторона присвоения, переменная, которая получает присвоенное значение.
...