Условный оператор: ?: | Microsoft Learn
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
- Чтение занимает 2 мин
Синтаксис
expression ? expression : expression
Условный оператор (? :) является тернарным оператором (он принимает три операнда). Условный оператор работает следующим образом.
Первый операнд неявно преобразуется в
bool
. Он вычисляется, и все побочные эффекты завершаются перед продолжением.Если первый операнд имеет
true
значение (1), вычисляется второй операнд.Если первый операнд имеет
false
значение (0), выполняется оценка третьего операнда.
Результатом условного оператора является оцененного операнда — второго или третьего. В условном выражении оценивается только один из последних двух операндов.
Условные выражения имеют ассоциативность справа налево. Первый операнд должен иметь целочисленный тип или тип указателя. Следующие правила применяются ко второму и третьему операндам.
Если оба операнда имеют один и тот же тип, результат имеет тот же тип.
Если оба операнда имеют арифметические типы или типы перечисления, обычные арифметические преобразования (охваченные стандартными преобразованиями) выполняются для их преобразования в общий тип.
Если оба операнда имеют тип указателя или один операнд относится к типу указателя, а другой является выражением константы со значением 0, преобразования указателя выполняются с целью преобразования их к общему типу.
Если оба операнда имеют ссылочные типы, для преобразования их в общий тип используются ссылочные преобразования.
Если оба операнда имеют тип void, общий тип также имеет тип void.
Если оба операнда относятся к одному определяемому пользователем типу, общий тип также относится к этому типу.
Если операнды относятся к разным типам и по крайней мере один из операндов относится к определяемому пользователем типу, для определения общего типа используются правила языка (см. предупреждение ниже).
Какие-либо сочетания второго и третьего операндов, отсутствующие в предыдущем списке, недопустимы. Тип результата — это общий тип и l-значение, если и второй, и третий операнды имеют один и тот же тип и представляют собой l-значения.
Предупреждение
Если типы второго и третьего операндов не идентичны, вызываются правила преобразования сложных типов в соответствии со стандартом C++. Эти преобразования могут привести к непредвиденному поведению, включая создание и удаление временных объектов. По этой причине мы настоятельно рекомендуем вам (1) либо избегать использования определяемых пользователем типов в качестве операндов в условных операторах, (2) либо, если определяемые пользователем типы все же используются, явно приводить каждый операнд к общему типу.
Пример
// expre_Expressions_with_the_Conditional_Operator.cpp // compile with: /EHsc // Demonstrate conditional operator #include <iostream> using namespace std; int main() { int i = 1, j = 2; cout << ( i > j ? i : j ) << " is greater." << endl; }
См. также раздел
Операторы C++, приоритет и ассоциативность
Оператор Conditional-Expression
Оператор if неполная форма в C++.
Урок 3.Первый урок мы посвятили тому, что учились решить наши задачи линейно. Их логика заключалась в том, чтобы мы получили ответ прямо в лоб и никаких ответвлений или отхода в сторону от правил быть не могло. Например, если нам надо запросить какое-то число, мы его запрашиваем, если нам надо сложить два числа, мы их складываем. И так далее.
На втором уроке мы говорили про логические выражения. Логические выражения нам позволяли получить уже какую-то вариативность в результате. А сегодня мы поговорим о том: «Что же делать, если нам не хватает полного контроля над кодом»?
Условный оператор
Условный оператор – конструкция языка программирования, позволяющая выполнять различные наборы блоков кода в зависимости от результата вычисления логического выражения.
Раньше у нас была линейная программа:
- Начало;
- Действие 1;
- Действие 2;
- Действие 3;
- Действие 4;
- Конец.
А что мы будем делать, если в одном случае нам надо выполнить одно действие, а в другом другое? Это мы уже будем называть ветвлением. Когда разные ветви кода выполняются при разных условиях.
Есть у нас начало программы, после этого выполнилось какое-то действие. После этого действия стоит условие. Если результатом этого условия будет 1, то мы выполним действие под номером 2. Если результатом условия будет 0? Мы выполним действие под номером 3. Что можно подразумевать под словом действие? Все что угодно. Мы можем запустить какую-либо функцию, можем вывести что-то на экран, можем запросить какие-либо дополнительные данные от пользователя и т.д. и т.п.
Но сегодня мы с вами пройдем только неполную форму условного оператора.
Для чего мы это делаем. Чтобы вы смогли понять то, что мы делаем. И главное, научиться работать с ограниченными возможностями. Безусловно, многие примеры можно решить быстрее и проще, но мы должны научиться решать тем способом, который изучили.
Неполная форма условного оператора
Неполная форма условного оператора – это когда кусочек кода будет выполнятся, если условие истинно (true). А если условие ложно (false), тогда ничего не произойдет. Например, если Иван опоздал на занятие, то сделать ему замечание, а в противном случае мы ничего не будем делать.
Наша программа будет двигаться сверху вниз, и будет проверять. Если условие true, то мы выполним то действие, которое нам необходимо по заданию. Если условие false, то действие не выполнится. Программа его проигнорирует. При этом, внутри нашего выражения, может быть сколько угодно других действий.
Синтаксис
Если (if) логическое выражение true, то мы будем выполнять те действия, которые записаны в фигурных скобках.
Вы можете встретить и такую запись
В C++ допускается не брать в скобки действие, если оно одно. Но лучшей практикой будет не использовать такую форму записи. К тому же бывают такие случаи, когда при такой форме записи, наша программа может сработать не так, как мы ожидаем, они редки, но все же случаются. Поэтому мы возьмем за правило, всегда использовать фигурные скобки.
Решение задач
Поменяй местами
Даны два числа a и b. Ваша программа должна поменять два числа местами, если a Формат входных данных
Даны два целых числа a и b (∣a∣,∣b∣ 9).
Формат выходных данных
Требуется вывести числа в том же формате, в котором они вводились.
Примеры
входные данные
3 5
11 4
выходные данные
5 3
11 4
Положительные в квадрат
Даны три числа — a, b, c. Требуется возвести положительные числа в квадрат, а отрицательные оставить без изменений и вывести числа в том же порядке.
Формат входных данных
На единственной строке входного файла содержатся три целых числа (−1044).
Формат выходных данных
Единственная строка выходного файла должна содержать три получившихся числа: a, b и c в исходном порядке, где положительные возведены в квадрат, а отрицательные оставлены без изменений.
Видео по теме урока
Условные операторы в C (?:) — синтаксис и примеры
В этой статье мы узнаем больше об условных операторах.
- Условный оператор — это тернарный оператор в C, используемый для условного вычисления. В предыдущей статье были рассмотрены операторы в C и их типы.
- Символ оператора ?:
- Это тернарный оператор, поскольку он оперирует тремя операндами.
Синтаксис условного оператора:
Рисунок 1. Синтаксис условного оператора- Условный оператор представляет собой набор трех операндов .
- выражение1 — это первый операнд, который может быть значением или выражением, или это может быть любой оператор C, например вызов функции или что-то в этом роде.
- Итак, за первым операндом следует вопросительный знак ( ? ), а за вторым операндом следует двоеточие ( : ), а после этого идет третий операнд.
- Здесь, если выражение1 истинно, то выполняется выражение2 ; если выражение1 ложно, то выполняется выражение3 .
Теперь давайте разберемся с вычислением условного оператора на примере. На рис. 2 показан пример.
Рисунок 2. Вычисление условного операнда на примереЗдесь есть переменная a и (5+4)? (9-4):99 — условное выражение операции. (5+4) — операнд1, (9-4) — операнд2, а 99 — операнд3.
В этом случае сначала вычисляется или выполняется выражение1. При выполнении 5+4, если этот операнд истинен, то будет выполнено выражение 9-4, а результат этого выражения будет сохранен в переменной a .
Если вычисление выражения 5+4 ложно, то будет выполнено или оценено 99, а результат будет сохранен в переменной a. В этом случае a = 5, потому что верно 5+4. Очень просто.
Если выражение1 верно, то выполняется выражение2; если выражение1 ложно, то выполняется выражение3.
Рисунок 3. Сводка условного операнда
Сводка условного оператора, как показано на рисунке 3. Сначала выполняется операнд выражение1, и если результат истинен, то выражение2 будет окончательным результатом. Таким образом, если оценка выражения 1 ложна, то окончательным результатом будет выражение 3.
Используйте условный оператор для замены операторов if-else
Например, рассмотрим приведенный ниже фрагмент кода.
Рисунок 4. Фрагмент кодаЗдесь вы сравниваете переменную age со значением 18, а затем принимаете решение.
Весь код можно записать в одну строку с помощью условного оператора.
Рисунок 5. Использование условного оператораЗдесь оценивается первый (возраст <18). Если оно верно, то будет выполнено выражение printf("вы не имеете права голоса\n"). В данном случае выражение представляет собой вызов функции, то есть printf. Обратите внимание, что в конце printf нет точки с запятой. Поскольку это законченное утверждение, которое заканчивается в конце, не ставьте промежуточную точку с запятой.
Теперь, если оценка (возраст<18) ложна, то будет выполнено printf("Поздравляем!!! Вы можете голосовать\n").
Итак, иногда вы можете использовать условный оператор вместо if-else.
Возьмем другой пример.
Рисунок 6. ПримерЗдесь int32_t a = 5. Каков результат a, после выполнения a=0?(a<9): a++; утверждение?
Сначала проверьте первый операнд a=0, который ложен, так как 5 не равно 0. Если первый операнд ложен, то будет выполнен третий операнд и присвоено значение переменной и . Здесь третий операнд — это а++. Эквивалентный код становится a = a++; (это постинкремент). Итак, результат a равен 5.
Некоторые из вас могут удивиться или возразить, что a = 6, но это не так. Итак, позвольте мне объяснить, как это выполняется.
В данном случае это а = а++. Начальное значение а равно 5. Когда мы обсуждали постинкремент и преинкремент, что я сказал? Сначала значение переменной а присваивается левой переменной, а затем значение а увеличивается. Итак, a становится 5,
а = 5;
а = а++;
а = 5;
Пример пост-инкремента приведен ниже.
Рисунок 7. Пример пост-инкремента
Теперь давайте рассмотрим другой пример. Здесь int32_t a=5, b=10. Выражение a = !(a+b) ? !(а<9) : а;. Какова ценность а?
Рисунок 8. ПримерСначала необходимо оценить операнд 1. операнд1 равен !(a + b) , что равно !(5+10) . Это означает !(15) . !(15) , что не что иное, как 0 (ложь).
Если первый операнд ложен, то будет выполнен третий операнд. Здесь третий операнд a . Таким образом, значение будет присвоено значение . Таким образом, значение a= 5 в этом случае.
Это касается условных операторов. Давайте узнаем об операторе switch/case в следующей статье.
Курсы FastBit Embedded Brain Academy
Нажмите здесь: https://fastbitlab.com/course1
Условный оператор: ?: | Microsoft Узнайте
Редактировать
Твиттер LinkedIn Фейсбук Эл. адрес
- Статья
- 2 минуты на чтение
Синтаксис
выражение ? выражение : выражение
Условный оператор ( ? : ) является тернарным оператором (требует трех операндов). Условный оператор работает следующим образом:
Первый операнд неявно преобразуется в
bool
. Он оценивается, и все побочные эффекты устраняются перед продолжением.Если первый операнд оценивается как
true
(1), оценивается второй операнд.Если первый операнд оценивается как
false
(0), оценивается третий операнд.
Результат условного оператора является результатом вычисляемого операнда — второго или третьего. В условном выражении оценивается только один из двух последних операндов.
Условные выражения имеют ассоциативность справа налево. Первый операнд должен быть целочисленного типа или типа указателя. Следующие правила применяются ко второму и третьему операндам:
Если оба операнда одного типа, результат будет того же типа.
Если оба операнда относятся к арифметическим или перечисляемым типам, для их преобразования в общий тип выполняются обычные арифметические преобразования (описанные в разделе Стандартные преобразования).
Если оба операнда относятся к типам указателей или если один из них является типом указателя, а другой является константным выражением, значение которого равно 0, выполняется преобразование указателя для преобразования их в общий тип.
Если оба операнда относятся к ссылочным типам, выполняется преобразование ссылок для преобразования их в общий тип.
Если оба операнда имеют тип void, общим типом будет тип void.
Если оба операнда относятся к одному и тому же определяемому пользователем типу, общим типом является этот тип.
Если операнды имеют разные типы и хотя бы один из операндов имеет определенный пользователем тип, то для определения общего типа используются языковые правила. (См. предупреждение ниже.)
Любые комбинации второго и третьего операндов, не указанные в предыдущем списке, недопустимы. Тип результата — общий тип, и это l-значение, если второй и третий операнды одного типа и оба являются l-значениями.