Каковы преимущества и недостатки оператора?: По сравнению со стандартным оператором if-else. Очевидные из них:
Условный?: Оператор
- Короче и лаконичнее при работе с прямыми сравнениями и присвоениями значений
- Не кажется таким гибким, как конструкция if / else
Стандартный If / Else
- Может применяться к большему количеству ситуаций (например, к вызовам функций)
- Часто излишне длинные
Читаемость, кажется, различается для каждого в зависимости от утверждения. Некоторое время после первого знакомства с оператором?: Мне потребовалось время, чтобы понять, как именно он работает. Вы бы порекомендовали использовать его везде, где это возможно, или придерживаться if / else, учитывая, что я работаю со многими непрограммистами?
c#
conditional-operator
KChaloux
источник
источник
SomeCheck() ? DoFirstThing() : DoSecondThing();
вы должны использовать выражение для возврата значения.Ответы:
Я бы в основном рекомендовал использовать его только тогда, когда результирующий оператор очень короткий и представляет собой значительное увеличение краткости по сравнению с эквивалентом if / else без ущерба для читабельности.
Хороший пример:
Плохой пример:
источник
return
быть частью результата тернарной операции. Например:check() ? return 1 : return 0;
не пойдет, ноreturn check() ? 1 : 0;
будет. Всегда весело находить эти маленькие причуды в программировании.Это в значительной степени покрывается другими ответами, но «это выражение» на самом деле не объясняет, почему это так полезно ...
В таких языках, как C ++ и C #, вы можете определять локальные поля только для чтения (в теле метода), используя их. Это невозможно с обычным оператором if / then, потому что значение поля readonly должно быть присвоено в этом единственном операторе:
не то же самое, что:
Аналогичным образом вы можете встроить третичное выражение в другой код. Это не только делает исходный код более компактным (и в некоторых случаях более читабельным), но и делает сгенерированный машинный код более компактным и эффективным:
... может генерировать меньше кода, чем необходимость дважды вызывать один и тот же метод:
Конечно, это также более удобная и краткая форма (меньше набора текста, меньше повторений и может уменьшить вероятность ошибок, если вам нужно дублировать фрагменты кода в if / else). В чистых случаях с «обычным шаблоном» вроде этого:
... он просто быстрее читать / анализировать / понимать (как только вы к нему привыкнете), чем многословный эквивалент if / else, поэтому он может помочь вам быстрее «разобрать» код.
Конечно, то, что это полезно , не означает, что его лучше всего использовать в каждом случае. Я бы посоветовал использовать его только для коротких фрагментов кода, где смысл ясен (или сделан более понятным) с помощью
?:
- если вы используете его в более сложном коде или вкладываете тернарные операторы друг в друга, это может сделать код ужасно трудным для чтения .источник
const
является константой, т.е. его нельзя изменить после выполнения оператора, в котором он объявлен.readonly
? Я всегда думал, что этоconst
означает « разрешено во время компиляции и встроено везде, где используется ».Я обычно выбираю тернарный оператор, если в противном случае у меня было бы много повторяющегося кода.
С тернарным оператором это можно сделать следующим образом.
источник
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
особенно еслиb
,c
,d
иe
требуется лечение тоже.compute(...)
isa > 0 ? a : -1
, который оценивается отдельно от других аргументов, разделенных запятыми. В любом случае, к сожалению, в C ++ отсутствует обозначение, которое задается в вашем вопросе для обработки «кортежей» значений, разделенных запятыми, поэтому дажеa > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
это недопустимо, и нет ничего похожего, что работало бы без измененийcompute
.Я считаю, что это особенно полезно при веб-разработке, если я хочу установить для переменной значение, отправленное в запросе, если оно определено, или какое-то значение по умолчанию, если это не так.
источник
Действительно классное использование:
источник
foo
ложно, тогда все будет оценено до 4 без выполнения других тестов.Условный оператор отлично подходит для коротких условий, например таких:
Я использую его время от времени, потому что на то, чтобы написать что-то таким образом, требуется меньше времени ... к сожалению, это ветвление иногда может быть пропущено другим разработчиком, просматривающим ваш код. Кроме того, код обычно не такой короткий, поэтому я обычно улучшаю читаемость, добавляя? и: в отдельных строках, например:
Однако большое преимущество использования блоков if / else (и почему я предпочитаю их) состоит в том, что проще зайти позже и добавить дополнительную логику в ветку,
или добавьте другое условие:
Итак, в конце концов, речь идет об удобстве для вас сейчас (короче:?) По сравнению с удобством для вас (и других) позже. Это суждение ... но, как и все другие проблемы с форматированием кода, единственное реальное правило - быть последовательным и быть визуально вежливым по отношению к тем, кто должен поддерживать (или оценивать!) Ваш код.
(весь код скомпилирован на глаз)
источник
При использовании тернарного оператора следует понимать, что это выражение, а не утверждение.
В функциональных языках, таких как схема, различия не существует:
(если (> ab) ab)
Условный?: Оператор «Кажется, не так гибок, как конструкция if / else»
В функциональных языках это так.
При программировании на императивных языках я применяю тернарный оператор в ситуациях, когда я обычно использую выражения (присваивание, условные операторы и т. Д.).
источник
Хотя приведенные выше ответы действительны, и я согласен с важностью удобочитаемости, есть еще два момента, которые следует учитывать:
Это делает использование тернарного типа особенно кратким:
Если у вас есть типы,
T1
иT2
оба они могут быть неявно преобразованы вT
, то приведенное ниже не работает:(поскольку компилятор пытается определить тип тернарного выражения, а преобразование между
T1
и отсутствуетT2
).С другой стороны,
if/else
версия ниже работает:потому что
T1
преобразован вT
и такT2
источник
Иногда это может облегчить чтение с первого взгляда:
источник
Если я устанавливаю значение и знаю, что для этого всегда будет одна строка кода, я обычно использую тернарный (условный) оператор. Если есть вероятность, что мой код и логика изменятся в будущем, я использую if / else, поскольку это более понятно другим программистам.
Возможно, вас еще интересует ?? оператор .
источник
Преимущество условного оператора в том, что это оператор. Другими словами, он возвращает значение. Поскольку
if
это инструкция, она не может возвращать значение.источник
Я бы рекомендовал ограничить использование тернарного оператора (? :) простым однострочным назначением логики if / else. Что-то похожее на этот узор:
Может быть легко преобразован в:
Я бы избегал использования тернарного оператора в ситуациях, требующих if / else if / else, вложенной логики if / else или if / else, которая приводит к оценке нескольких строк. Применение тернарного оператора в этих ситуациях, вероятно, приведет к нечитаемому, запутанному и неуправляемому коду. Надеюсь это поможет.
источник
Есть некоторый выигрыш в производительности от использования оператора? оператор в например. MS Visual C ++, но это действительно специфическая вещь для компилятора. В некоторых случаях компилятор может оптимизировать условную ветвь.
источник
Сценарий, который я чаще всего использую, - это значения по умолчанию и особенно при возврате
Это действительно единственные места, которые мне нравятся, но я люблю их.
Хотя, если вы ищете логическое значение, это может иногда выглядеть уместным:
Потому что это так легко читать и понимать, но эту идею всегда следует отбрасывать в пользу более очевидного:
источник
Если вам нужно несколько веток с одним и тем же условием, используйте if:
Если вам нужно несколько ветвей с разными условиями, тогда, если количество операторов будет снежным комом, вы захотите использовать тройной:
Кроме того, вы можете использовать тернарный оператор при инициализации.
Делать это с if очень беспорядочно:
Вы не можете поместить инициализацию внутри if / else, потому что это меняет область видимости. Но ссылки и константные переменные могут быть связаны только при инициализации.
источник
Тернарный оператор может быть включен в rvalue, тогда как if-then-else не может; с другой стороны, if-then-else может выполнять циклы и другие операторы, тогда как тернарный оператор может выполнять только (возможно, пустые) rvalue.
В связи с этим, && и || Операторы позволяют использовать некоторые шаблоны выполнения, которые труднее реализовать с помощью if-then-else. Например, если у кого-то есть несколько функций для вызова и он хочет выполнить фрагмент кода в случае сбоя какой-либо из них, это можно сделать с помощью оператора &&. Выполнение этого без этого оператора потребует либо избыточного кода, либо goto, либо дополнительной переменной-флага.
источник
В C # 7 вы можете использовать новую функцию ref locals для упрощения условного присвоения ref-совместимых переменных. Итак, теперь вы можете не только:
... но также чрезвычайно замечательный:
Эта строка кода присваивает значение
a
либоb
илиc
, в зависимости от значенияi
.Примечания
1. Значение r - это правая часть присваивания, значение, которое присваивается.
2. l-значение - это левая часть присваивания, переменная, которая получает присвоенное значение.
источник