Урок №41. Оператор sizeof, запятая и условный тернарный оператор

  Юрий  | 

    | 

  Обновл. 12 Апр 2019  | 

 13652

 ǀ   3 

В этом уроке мы рассмотрим оператор запятую, условный тернарный оператор и вспомним оператор sizeof.

Оператор sizeof

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

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

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

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


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

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

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

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

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

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

Большинство программистов не используют оператор comma вообще (разве что только в циклах for). О цикле 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 (128 оценок, среднее: 4,88 из 5)
Загрузка...

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

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

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

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

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

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

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

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

Добавить комментарий

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