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

   ⁄ 

 Обновлено 5 Мар 2017

  ⁄   

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

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

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

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

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

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

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

Например:

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

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

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

Большинство программистов не используют оператор comma вообще, только внутри циклов for. О for мы поговорим в следующих уроках.

Хоть запятая и используется для разделения параметров при вызове функции — это не оператор comma.

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

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

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

Условный оператор ?: — это единственный тернарный оператор в С++ (который принимает 3 операнда). Из-за этого, его часто называют просто «тернарный оператор» (но мы не советуем пользоваться этим именем, дабы избежать путаницы, если в будущем в C++ появится еще один тернарный оператор).

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

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

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

if (condition)
   expression;
else
   other_expression;

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

(condition) ? expression : other_expression;

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

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

if (condition)
   x = some_value
else
   x = some_other_value

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

x = (condition) ? some_value : some_other_value;

Большинство предпочитает последний вариант из-за лучшей читабельности.

Другой пример: чтобы разместить значение х или у в переменной larger мы можем сделать так:

или вот так:

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

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

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

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

Или вот это:

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

будет вычисляться как:

В консольном окне мы увидим 1 (true), если х > у или 0 (false), если x < y.

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

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

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

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

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

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

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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (9 оценок, среднее: 4,78 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

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

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