Что значит знак вопроса в с

от admin

Что значит знак вопроса в с

операнд-1 ? операнд-2 : операнд-3

Оператор такого типа называют тернарным оператором или условным оператором. Применяется на языках C, C++, Java. Его результат зависит от условия, которое вычисляется до вопросительного знака. Операнд-1 должен быть целого или плавающего типа или быть указателем. Он оценивается с точки зрения его эквивалентности 0.

Если операнд-1 не равен 0, то вычисляется операнд-2 и его значение является результатом операции. Если операнд-1 равен 0, то вычисляется операнд-3 и его значение является результатом операции.

Следует отметить, что вычисляется либо операнд-2, либо операнд-3, но не оба. Тип результата зависит от типов операнда-2 и операнда-3, следующим образом.

1. Если операнд-2 или операнд-3 имеет целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования.
2. Если операнд-2 и операнд-3 имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.
3. Если оба операнда имеют тип void, то результат имеет тип void.
4. Если один операнд является указателем на объект любого типа, а другой операнд является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата.
5. Если один из операндов является указателем, а другой константным выражением со значением 0, то типом результата будет тип указателя.

Здесь переменной max присваивается максимальное значение переменных d и b.

Что означает знак вопроса и двоеточие (?: Троичный оператор) в target-c?

Это тернарный или условный оператор. Это базовая форма:

Если значения будут оцениваться только в том случае, если они выбраны.

Строительство на Барри Wark отличное объяснение.

Что так важно в тройном операторе, так это то, что его можно использовать в тех местах, где if-else не может. т.е.: внутри параметра условия или метода.

. что очень полезно для препроцессорных констант:

Это избавит вас от необходимости использовать и освобождать локальные переменные в шаблонах if-else. FTW!

Просто логика будет

(condition) ? (code for YES) : (code for NO)

Это обычный обычный тернарный оператор. Если часть перед вопросительным знаком истинна, она оценивает и возвращает часть перед двоеточием, иначе она оценивает и возвращает часть после двоеточия.

Это просто краткая форма написания оператора if-then-else. Это означает, что следующий код:

Это часть C, поэтому она не имеет значения Objective-C. Здесь перевод в оператор if :

Как все говорили, что это способ представления условного оператора

с использованием тернарного оператора (condition)? true:false Чтобы добавить дополнительную информацию, в Quickift у нас есть новый способ представления с помощью ?? .

if (a>c)?a:c == > Является равным if (a>c)?:c

вместо ?: мы можем использовать ?? быстро.

Я только что узнал что-то новое о тернарном операторе. Короткая форма, которая опускает средний операнд, действительно элегантна и является одной из многих причин, по которым C остается актуальной. FYI, я вначале столкнулся с этим в контексте процедуры, реализованной на С#, которая также поддерживает тройной оператор. Поскольку тернарный оператор находится в C, то разумно, что он был бы на других языках, которые по существу являются его расширениями (например, Objective-C, С#).

Знак вопроса (?) в C#

Довольно часто при работе с C# мы можем встретить в коде знак вопроса «?». При этом, в зависимости от того где поставлен этот знак в коде зависит и его роль. Например знак вопроса можно встретить после типа данных, после имени экземпляра класса, в условных выражениях и т.д. В этой заметке я решил собрать основные способы использования символа вопроса (?) в C#.

Знак ? в т ернарных операциях C#. Оператор ?:

Про тернарные операции в C# (сокращенная проверка) мы узнали вот из этой статьи. Здесь вопрос ставится сразу после условия, которое необходимо проверить. Например:

в тернарной операции знак вопроса (?) используется в паре с двоеточием (:) и читается код выше следующим образом: если остаток от деление числа на два равен нулю, то число четное, иначе — нечетное.

Знак ? в NULL-условных операторах ?. и ?[]

Эти операторы появились впервые в C# 6 и применяются для доступа к членам, ?. , или доступа к элементам, ?[] операнда только в том случае, если он имеет значение, отличное от NULL , в противном случае он возвращает null .

Например, у нас есть класс Building и объект (экземпляр класса) — house . Нам необходимо получить доступ к какому-либо свойству этого объекта, однако, мы не можем быть на 100% уверены, что объект проинициализирован, то есть не равен null . Если мы напишем свой код, например, вот так:

то не факт, что мы получим значение свойства, а не исключение. И здесь нам на помощь может прийти либо условный оператор if , что потребует от нас лишней «писанины», либо тернарная операция, что ненамного сократит код, например:

или же NULL-условный оператор, как показано ниже:

Согласитесь, что в последнем случае код стал намного короче. Не могу сказать, что понятнее с первого взгляда (особенно, если вы новичок в C#), но короче — явно. Использование этого оператора — дело привычки и со временем начинаешь очень быстро отслеживать такой оператор в коде.

Работает NULL-условный оператор следующим образом:

Если house вычисляется как null , то результатом house?.width является null .
Если house принимает значение, отличное от NULL , то результат house?.width совпадает с результатом house.width .

Аналогичным образом работает и оператор ?[] .

Знак ? в операторе объединения с NULL ??

Ещё один оператор C# в котором используется знак вопроса ( ? ) и, при чем, дважды. Оператор объединения с NULL ?? возвращает значение своего операнда слева, если его значение не равно null . В противном случае он вычисляет операнд справа и возвращает его результат.

Например, рассмотрим вариант использования оператора ?? в связке с NULL-условным оператором. В выражениях с NULL-условным оператором ?. или ?[] можно использовать null , чтобы задать альтернативное выражение для оценки на случай, если результат выражения с NULL-условной операцией будет равен .

Здесь в примере в качестве параметров метода SumNumbers задается список наборов чисел и индекс набора в этом списке. Функция должна вернуть сумму чисел или значение NaN . Вначале применяется оператор ?[] , если проверка проходит успешно ( setsOfNumbers?[indexOfSetToSum] не равен null ), то осуществляется следующая проверка с использованием оператора ?. Если и вторая проверка прошла успешна, то вычисляется сумма. Если какая-либо из проверок вернет нам null , то результатом функции будет NaN .

Знак ? в операторе присваивания объединения со значением NULL ??=

Этот оператор появился впервые в C# 8.0. Оператор ??= используется для присваивания значения правого операнда левому операнду только в том случае, если левый операнд принимает значение null . Оператор ??= не выполняет оценку своего операнда справа, если его операнд слева имеет значение, отличное от NULL .

Знак ? справа от типа. Типы значений, допускающие значение NULL (обнуляемые типы)

Довольно часто в различных пакетах C# можно встретить знак вопроса справа от типа данных, например, в стандартном классе Convert :

а можно встретить и такую запись:

Что означает знак вопроса рядом с типом, а точнее, справа от типа данных? Означает это, что перед нами тип значения, которому можно присвоить значение null . До сих пор мы были уверены (и так оно и есть), что такие типы данных как int , bool или, например, double не могут принимать значение null . Если же справа от типа стоит знак вопроса, то перед нами тип данных, который допускает значение null .

Обнуляемые типы — это экземпляры структуры System.Nullable . При этом, обнуляемый тип может представлять правильный диапазон значений для своего базового типа значения, а также дополнительное нулевое значение (null). Например, Nullable < Int32 > , произносится как «Nullable of Int32», может быть присвоено любое значение от -2147483648 до 2147483647, или ему может быть присвоено нулевое значение. Следующие два определения переменной будут эквивалентны:

Читать:
Mkvtoolnix что это за программа

Обнуляемые типы удобно использовать при работе с базами данных, когда поле таблицы может принимать значение, например, true / false , а может быть и не определено, то есть иметь значение null .

Итого

В C# символ ? , видимо, по праву можно считать одним из самых часто используемых символов в языковых конструкциях. Чтобы понять, для чего конкретно применяется символ вопроса необходимо, как минимум определить где он стоит (справа от типа данных, справа от имени объекта и т.д.). Например, если символ вопроса стоит справа от типа данных, то это значит, что перед нами обнуляемый тип данных.

Тернарный оператор ? : в C++

Надеюсь, вы хорошо разобрались с темой операторы выбора if и else и вам не составило большого труда решить задачи по этой теме. В этом же уроке мы продолжаем изучать основы программирования на C++ и познакомимся еще с одним оператором выбора (ветвления) – это тернарный оператор ? :

Используется он обычно в тех случаях, если условие и код, который надо выполнить, в результате проверки условия, очень простые. К примеру, спросить у пользователя хочет он продолжить работать в программе или же хочет выйти из неё. Синтаксис такой:

Вначале надо записать необходимое нам условие и за ним поставить знак вопроса ? . Далее, в этой же строке, после знака вопроса пишем первую простую команду (код), которая будет выполняться, если условие вернет истину ( true ). После этой команды ставим двоеточие : и пишем вторую команду (код). Эта вторая команда после двоеточия, выполнится только в том случае, если условие возвращает ложь ( false ).

Пример. Допустим пользователь снимает деньги в банкомате. Он провел эту операцию и на экране должен появиться вопрос: “Вы хотите выполнить другую операцию?” Пользователю остается сделать выбор (да или нет) и нажать соответствующую кнопку. Организуем этот выбор в следующей программе:

Пользователь делает выбор и вводит значение – строка 13. А в строке 15 мы проверяем введенное значение. Если условие variable == 1 возвращает true (то есть если переменная действительно равна 1), то выполнится код, расположенный после знака вопроса ? . А тот, что находится после двоеточия : – игнорируется. Иначе, если пользователь ввел 0, игнорируется код расположенный между ? и : , а выполняется второй код. Вот результат работы если введено 1:

тернарный оператор ?:

тернарный оператор ?:

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

Рассмотрим строку 20. Код будет выполняться так – вначале отработает тернарный оператор, вернет значение исходя из поставленного условия, а после это значение запишется в переменную max . Если условие (firstDigit > secondDigit) – истина, значение firstDigit записывается в max , если ложь, то записывается значение secondDigit . Далее должно быть всё понятно. Компилируем:

тернарный оператор ?:

Программа работает отлично!

Хорошо о тернарном операторе рассказано в этом видео-уроке.

Напоследок добавлю, что в некоторых соглашениях о кодировании не рекомендуют использовать тернарный оператор из-за того, что снижается читабельность кода. Но знать о нём надо, так как никто не может предугадать, какие коды придется встретить и читать в будущем. О соглашениях кодирования больше можно узнать в нашей статье Форматирование исходного кода.

11 thoughts on “ Тернарный оператор ? : в C++ ”

ИМХО стоит добавить, что не все соглашения о кодировании вообще разрешают использовать тернарный оператор, т.к. часто падает простота восприятия кода.

Вот так:

variable == 1 ? cout << "Выберите операцию!\n. \n\n" : cout << "До свидания! Не забудьте взять чек!\n\n";

точно лучше не делать.
1) У тебя variable – переменная типа bool, поэтому variable == 1 стоит заменить на variable.
2) Ты сравниваешь булевую переменную с целым числом, это может запутать других программистов.
3) По некоторым соглашениям о кодировании при сравнении на равенство константное выражение должно быть в левой части (чтобы не получилось написать variable = 1 вместо variable == 1, т.к. 1 = variable выдаст ошибку на этапе компиляции).
4) я бы записал так:

cout << (variable ? "Выберите операцию!\n. \n\n" : "До свидания! Не забудьте взять чек!\n\n");

Ряд товарищей посоветовали бы вместо variable написать true == variable, но тут можно спорить :).

Вобщем весь код такой. Я бы это:

max = (firstDigit > secondDigit) ? firstDigit : secondDigit;

// так же определяем и записываем min
min = (firstDigit < secondDigit) ? firstDigit : secondDigit;

заменил так (примерно):

a > b ? max = a, min = b : max = b, min = a;

тут нет смысла выполнять сравнение 2 раза и нет смысла брать условие в скобки

Из последнего примера видно, что двоеточием разделяется не одна команда и другая команда (как на твоем рисунке), а выражения. Притом я бы упомянул, что оператор запятая тоже возвращает значение.

rrrFer (он же Владимир), это замечательно, что ты так тщательно вычитываешь наши статьи. Что можно сказать по твоему комментарию? Скажу так – совершенствовать и оптимизировать код можно до бесконечности. Благодаря твоему комментарию читатели увидят, что одну и ту же задачу можно решить различными способами и что есть разные варианты обращения с булевксими переменными. В твоем случае код более оптимизирован. А мой код расписан более подробно (так мы ориентируемся в первую очередь на новичков) и точно так же, как и твой код, имеет право на жизнь.
P.S. Ругательства из твоего комментария удалены и в дальнейшем их видеть не хотелось бы

Эммм… в моем комментарии были ругательства? )

Я не вычитывал статьи вообще, я посмотрел рисунок и исходный код.

Дело тут не в оптимизации, а в потенциальных косяках, которые никогда не появятся если следовать некоторым соглашениям.

Ну например, когда ты сравниваешь булевую переменную с целым числом, что происходит? – происходит приведение типа bool к типу int, при этом в стандарте закреплено, что true соответствует единице, а false – нулю. Но если бы целое число кастовалось в bool, то 2 == true должно было бы вернуть true (но это не так, хотя всякие студенты и школьники могут сомневаться, ведь они не читали стандарт).

Про соглашения я писал к тому, что есть подводные камни. Например однажды ты напишешь свой класс комплексных чисел и перегрузишь для него оператор сравнения и оператор приведения типа к bool. Я думаю, что можно получить разное и опасное поведение в этом случае. Т.е. правильнее сравнивать переменные одного типа, а не надеяться на то что оно автоматически скастуется.

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

e = a < b ? b < c ? 1 : 2 : c < d ? 3 : 4;

У нас к соглашении о кодировании были перечислены случаи когда РАЗРЕШАЕТСЯ использовать этот оператор чтобы не допустить вот такой код.

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

В примере с if else значения max и min принимают 0, объясните пожалуйста в чем ошибка?

а можно привести пример на си с использованием тернарного оператора для поиска минимального из трех чисел? никак не могу сообразить((

X = ( x1 < x2 && x1 < x3 ) ? x1 : x2 < x3 ? x2 : x3;

Похожие статьи