Урок №41. Условный тернарный оператор, sizeof() и Запятая

  Юрий  | 

  Обновл. 29 Дек 2019  | 

 30230

 ǀ   5 

В этом уроке мы рассмотрим условный тернарный оператор, оператор Запятую и вспомним оператор sizeof() в C++.

Оператор sizeof()

Мы уже рассматривали оператор sizeof() в уроке №30.

Оператор Символ Пример Операция
sizeof sizeof sizeof(type)
sizeof(variable)
Возвращает размер типа данных или переменной в байтах

Тогда мы использовали его для определения размера конкретных типов данных. Но также sizeof() можно использовать и с переменными:

Оператор Запятая


Оператор Запятая (или ещё «оператор comma») позволяет обрабатывать несколько выражений (в то время как допускается только одно).

Оператор Символ Пример Операция
Запятая , x, y Вычисляется x, затем вычисляется y, а затем возвращается значение y

Выражение, в котором находится этот оператор, будет иметь значение правого операнда.

Например:

Переменной z будет присвоен результат вычисления ++у (правого операнда), что равно 3.

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

Обратите внимание, оператор Запятая имеет самый низкий приоритет из всех операторов (даже ниже, чем в оператора присваивания). Из-за этого, следующие две строчки кода делают не одно и то же:

Большинство программистов не используют оператор comma вообще (разве что только в циклах for).

Обратите внимание, запятая, которая используется в вызовах функций, не является оператором comma:

Аналогично при объявлении нескольких переменных в одной строке, запятая используется как разделитель, а не как оператор:

Правило: Избегайте использования оператора comma (исключение — циклы for).

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

Условный (тернарный) оператор (?:) является единственным тернарным оператором в С++ (который работает с 3-мя операндами). Из-за этого его часто называют просто «тернарный оператор«.

Оператор Символ Пример Операция
Условный ?: c ? x : y Если c — ненулевое значение (true), то вычисляется x, в противном случае — y

Оператор ?: предоставляет сокращённый способ (альтернативу) ветвления if/else.

Стейтменты if/else:

if (условие)
   выражение;
else
   другое_выражение;

можно записать как:

(условие) ? выражение : другое_выражение;

Обратите внимание, операнды условного оператора должны быть выражениями (не стейтментами).

Например, ветвление if/else, которое выглядит следующим образом:

if (условие)
   x = значение1
else
   x = значение2

можно записать как:

x = (условие) ? значение1 : значение2;

Большинство программистов предпочитают последний вариант, так как он более читабельный.

Ещё один пример. Чтобы определить, какое значение поместить в переменную larger, мы можем сделать так:

Или вот так:

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

Выражения между ? и : вычисляются так, как если бы они находились в круглых скобках. Помните, что оператор ?: имеет очень низкий приоритет. Из-за этого его следует записывать в круглых скобках.

Например, для вывода х и у, мы можем сделать следующее:

Или следующее:

Поскольку оператор << имеет более высокий приоритет, чем оператор ?:, то стейтмент:

Будет обрабатываться как:

В консольном окне мы увидим x, если х > у или y, если x < y.

Условный тернарный оператор — это удобное упрощение ветвления if/else, особенно при присваивании результата переменной или возврате определённого значения. Но его не следует использовать вместо сложных ветвлений if/else, так как в таких случаях читабельность кода резко ухудшается и вероятность возникновения ошибок только растёт.

Правило: Используйте условный тернарный оператор ?: только в простых случаях.

Условный тернарный оператор вычисляется как выражение


Стоит отметить, что условный оператор вычисляется как выражение, в то время как ветвление if/else обрабатываются как стейтменты. Это означает, что тернарный оператор ?: может быть использован там, где if/else нет.

Например, при инициализации константы:

Здесь нельзя использовать if/else, так как константы должны быть инициализированы при объявлении, а стейтмент не может быть значением для инициализации.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (275 оценок, среднее: 4,93 из 5)
Загрузка...

Комментариев: 5

  1. Аватар Андрей:

    Всем доброго времени суток!

    при программировании Ардуино для передачи данных в коде используется sizeof(data) для передачи данных в массив.
    Не могу понять как это работает. ведь sizeof(data)
    передает только размер а не значение.

    1. Аватар Степан:

      Но сначала передается адрес массива, то есть функция уже имеет доступ к данному массиву. А второй параметр sizeof(data), по моему мнению нужен чтоб узнать количество елементов массива путем деление общего обьема памяти массива на обьем памяти одного его елемента:

  2. Аватар Константин:

    Однозначно это только компилятор скажет:-)

  3. Аватар александр:

    Скажите, пожалуйста, код(ниже) с использованием "condition operator" грамотно написан ?
    Спасибо.

    1. Аватар Илья:

      С точки зрения синтаксиса — нормально. Но это нечитаемый ужас…

Добавить комментарий для александр Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *