Условный оператор в си: Оператор ?:. Справочник по C#

Содержание

Условный (тернарный) оператор — JavaScript

Условный (тернарный) оператор — единственный оператор в JavaScript, принимающий три операнда: условие, за которым следует знак вопроса (?), затем выражение, которое выполняется, если условие истинно, сопровождается двоеточием (:), и, наконец, выражение, которое выполняется, если условие ложно. Он часто используется в качестве укороченного варианта условного оператора if.

Оператор возвращает значение выражения1, если условие верно, и значение выражения2 в противном случае. Например, чтобы вывести сообщение, текст которого зависит от значения переменной isMember, можно использовать такое выражение:

"The fee is " + (isMember ? "$2.00" : "$10.00")

Также можно присваивать значения переменным на основе результатов работы тернарного оператора :

var elvisLives = Math.PI > 4 ? "Да" : "Нет";

Возможны множественные тернарные операции (обратите внимание: условный оператор ассоциативен справа):

var firstCheck = false,
    secondCheck = false,
    access = firstCheck ? "Доступ запрещён" : secondCheck ? "Доступ запрещён" : "Доступ разрешён";

console. log( access ); 

Тернарные операции можно использовать и сами по себе — для выполнения различных операций:

var stop = false, age = 16;

age > 18 ? location.assign("continue.html") : stop = true;

Также возможно выполнять несколько операций на каждое сравнение, разделив их запятыми:

var stop = false, age = 23;

age > 18 ? (
    alert("Хорошо, вы можете продолжить."),
    location.assign("continue.html")
) : (
    stop = true,
    alert("Простите, вы ещё так юны!")
);

При присвоении значения также возможно выполнение более одной операции. В этом случае переменной

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

var age = 16;

var url = age > 18 ? (
    alert("Хорошо, вы можете продолжить."),
    
    
    "continue.html" 
) : (
    alert("Вы слишком молоды!"),
    alert("Простите :-("),
    
    "stop.html" 
);

location.assign(url); 

Intel Core i74790 Processor 8M Cache up to 4.00 GHz Спецификации продукции

Дата выпуска

Дата выпуска продукта.

Ожидается прекращение производства

Ожидается прекращение производства — это оценка времени, когда для продукции начнется процесс снятия с производства.Уведомление о снятии продукции с производства (PDN), опубликованное в начале процесса, будет включать в себя все сведения об основных этапах снятия с производства. Некоторые подразделения могут сообщать сведения о сроках снятия с производства до публикации PDN. Обратитесь к представителю Intel для получения информации о сроках снятия с производства и вариантах продления сроков.

Литография

Литография указывает на полупроводниковую технологию, используемую для производства интегрированных наборов микросхем и отчет показывается в нанометре (нм), что указывает на размер функций, встроенных в полупроводник.

Количество ядер

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

Количество потоков

Поток или поток выполнения — это термин программного обеспечения, обозначающий базовую упорядоченную последовательность инструкций, которые могут быть переданы или обработаны одним ядром ЦП.

Базовая тактовая частота процессора

Базовая частота процессора — это скорость открытия/закрытия транзисторов процессора. Базовая частота процессора является рабочей точкой, где задается расчетная мощность (TDP). Частота измеряется в гигагерцах (ГГц) или миллиардах вычислительных циклов в секунду.

Максимальная тактовая частота в режиме Turbo

Максимальная тактовая частота в режиме Turbo — это максимальная тактовая частота при нагрузке на одно ядро процессора, которую можно достичь с помощью поддерживаемых им технологий Intel® Turbo Boost и Intel® Thermal Velocity Boost. Частота измеряется в гигагерцах (ГГц) или миллиардах вычислительных циклов в секунду.

Кэш-память

Кэш-память процессора — это область быстродействующей памяти, расположенная в процессоре. Интеллектуальная кэш-память Intel® Smart Cache указывает на архитектуру, которая позволяет всем ядрам совместно динамически использовать доступ к кэшу последнего уровня.

Частота системной шины

Шина — это подсистема, передающая данные между компонентами компьютера или между компьютерами. В качестве примера можно назвать системную шину (FSB), по которой происходит обмен данными между процессором и блоком контроллеров памяти; интерфейс DMI, который представляет собой соединение «точка-точка» между встроенным контроллером памяти Intel и блоком контроллеров ввода/вывода Intel на системной плате; и интерфейс Quick Path Interconnect (QPI), соединяющий процессор и интегрированный контроллер памяти.

Частота с технологией Intel® Turbo Boost 2.0

Тактовая частота с технологией Intel® Turbo Boost 2.0 — это максимальная тактовая частота одного ядра процессора, которую можно достичь с помощью технологии Intel® Turbo Boost. Частота обычно измеряется в гигагерцах (ГГц) или миллиардах вычислительных циклов в секунду.

Расчетная мощность

Расчетная тепловая мощность (TDP) указывает на среднее значение производительности в ваттах, когда мощность процессора рассеивается (при работе с базовой частотой, когда все ядра задействованы) в условиях сложной нагрузки, определенной Intel. Ознакомьтесь с требованиями к системам терморегуляции, представленными в техническом описании.

Доступные варианты для встраиваемых систем

Доступные варианты для встраиваемых систем указывают на продукты, обеспечивающие продленную возможность приобретения для интеллектуальных систем и встроенных решений. Спецификация продукции и условия использования представлены в отчете Production Release Qualification (PRQ). Обратитесь к представителю Intel для получения подробной информации.

Макс. объем памяти (зависит от типа памяти)

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

Типы памяти

Процессоры Intel® поддерживают четыре разных типа памяти: одноканальная, двухканальная, трехканальная и Flex.

Макс. число каналов памяти

От количества каналов памяти зависит пропускная способность приложений.

Макс. пропускная способность памяти

Макс. пропускная способность памяти означает максимальную скорость, с которой данные могут быть считаны из памяти или сохранены в памяти процессором (в ГБ/с).

Поддержка памяти ECC

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

Встроенная в процессор графическая система

Графическая система процессора представляет собой интегрированную в процессор схему обработки графических данных, которая формирует работу функций видеосистемы, вычислительных процессов, мультимедиа и отображения информации. Системы HD-графики Intel®, Iris™ Graphics, Iris Plus Graphics и Iris Pro Graphics обеспечивают расширенное преобразование медиа-данных, высокие частоты кадров и возможность демонстрации видео в формате 4K Ultra HD (UHD). Для получения дополнительной информации см. страницу Технология Intel® Graphics.

Базовая частота графической системы

Базовая частота графической системы — это номинальная/гарантированная тактовая частота рендеринга графики (МГц).

Макс. динамическая частота графической системы

Макс. динамическая частота графической системы — это максимальная условная частота рендеринга (МГц), поддерживаемая HD-графикой Intel® с функцией Dynamic Frequency.

Макс. объем видеопамяти графической системы

Максимальное количество памяти, доступное для графической системы процессора. Графическая система процессора использует ту же память, что и сам процессор (с учетом ограничений для ОС, драйвера и системы т.д).

Вывод графической системы

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

Макс. разрешение (HDMI 1.4)‡

Максимальное разрешение (HDMI) — максимальное разрешение, поддерживаемое процессором через интерфейс HDMI (24 бита на пиксель с частотой 60 Гц). Системное разрешение или разрешение экрана зависит от нескольких факторов дизайна системы, а именно, фактическое разрешение в системе может быть ниже.

Макс. разрешение (DP)‡

Максимальное разрешение (DP) — максимальное разрешение, поддерживаемое процессором через интерфейс DP (24 бита на пиксель с частотой 60 Гц). Системное разрешение или разрешение экрана зависит от нескольких факторов дизайна системы, а именно, фактическое разрешение в системе может быть ниже.

Макс. разрешение (eDP — встроенный плоский экран)

Максимальное разрешение (встроенный плоский экран) — максимальное разрешение, поддерживаемое процессором для встроенного плоского экрана (24 бита на пиксель с частотой 60 Гц). Системное разрешение или разрешение экрана зависит от нескольких факторов дизайна системы; фактическое разрешение на устройстве может быть ниже.

Макс. разрешение (VGA)‡

Максимальное разрешение (VGA) — максимальное разрешение, поддерживаемое процессором через интерфейс VGA (24 бита на пиксель с частотой 60 Гц). Системное разрешение или разрешение экрана зависит от нескольких факторов дизайна системы, а именно, фактическое разрешение в системе может быть ниже.

Поддержка DirectX*

DirectX* указывает на поддержку конкретной версии коллекции прикладных программных интерфейсов Microsoft для обработки мультимедийных вычислительных задач.

Поддержка OpenGL*

OpenGL (Open Graphics Library) — это язык с поддержкой различных платформ или кроссплатформенный прикладной программный интерфейс для отображения двухмерной (2D) и трехмерной (3D) векторной графики.

Intel® Quick Sync Video

Технология Intel® Quick Sync Video обеспечивает быструю конвертацию видео для портативных медиапроигрывателей, размещения в сети, а также редактирования и создания видео.

Технология InTru 3D

Технология Intel InTru 3D позволяет воспроизводить трехмерные стереоскопические видеоматериалы в формате Blu-ray* с разрешением 1080p, используя интерфейс HDMI* 1.4 и высококачественный звук.

Интерфейс Intel® Flexible Display (Intel® FDI)

Intel® Flexible Display — это инновационный интерфейс, позволяющий выводить независимые изображения на два канала с помощью интегрированной графической системы.

Технология Intel® Clear Video HD

Технология Intel® Clear Video HD, как и предшествующая ее появлению технология Intel® Clear Video, представляет собой набор технологий кодирования и обработки видео, встроенный в интегрированную графическую систему процессора. Эти технологии делают воспроизведение видео более стабильным, а графику — более четкой, яркой и реалистичной. Технология Intel® Clear Video HD обеспечивает более яркие цвета и более реалистичное отображение кожи благодаря улучшениям качества видео.

Редакция PCI Express

Редакция PCI Express — это версия, поддерживаемая процессором. PCIe (Peripheral Component Interconnect Express) представляет собой стандарт высокоскоростной последовательной шины расширения для компьютеров для подключения к нему аппаратных устройств. Различные версии PCI Express поддерживают различные скорости передачи данных.

Конфигурации PCI Express

Конфигурации PCI Express (PCIe) описывают доступные конфигурации каналов PCIe, которые можно использовать для привязки каналов PCH PCIe к устройствам PCIe.

Макс. кол-во каналов PCI Express

Полоса PCI Express (PCIe) состоит из двух дифференциальных сигнальных пар для получения и передачи данных, а также является базовым элементом шины PCIe. Количество полос PCI Express — это общее число полос, которое поддерживается процессором.

Поддерживаемые разъемы

Разъемом называется компонент, которые обеспечивает механические и электрические соединения между процессором и материнской платой.

Спецификации системы охлаждения

Рекомендуемая спецификация системы охлаждения Intel для надлежащей работы процессора.

T

CASE

Критическая температура — это максимальная температура, допустимая в интегрированном теплораспределителе (IHS) процессора.

Технология Intel® Turbo Boost

Технология Intel® Turbo Boost динамически увеличивает частоту процессора до необходимого уровня, используя разницу между номинальным и максимальным значениями параметров температуры и энергопотребления, что позволяет увеличить эффективность энергопотребления или при необходимости «разогнать» процессор.

Соответствие платформе Intel® vPro™

Платформа Intel vPro® представляет собой набор аппаратных средств и технологий, используемых для создания конечных систем бизнес-вычислений с высокой производительностью, встроенной безопасностью, современными функциями управления и стабильности платформы.
Подробнее о технологии Intel vPro®

Технология Intel® Hyper-Threading

Intel® Hyper-Threading Technology (Intel® HT Technology) обеспечивает два потока обработки для каждого физического ядра. Многопоточные приложения могут выполнять больше задач параллельно, что значительно ускоряет выполнение работы.

Технология виртуализации Intel® (VT-x)

Технология Intel® Virtualization для направленного ввода/вывода (VT-x) позволяет одной аппаратной платформе функционировать в качестве нескольких «виртуальных» платформ. Технология улучшает возможности управления, снижая время простоев и поддерживая продуктивность работы за счет выделения отдельных разделов для вычислительных операций.

Технология виртуализации Intel® для направленного ввода/вывода (VT-d)

Технология Intel® Virtualization Technology для направленного ввода/вывода дополняет поддержку виртуализации в процессорах на базе архитектуры IA-32 (VT-x) и в процессорах Itanium® (VT-i) функциями виртуализации устройств ввода/вывода. Технология Intel® Virtualization для направленного ввода/вывода помогает пользователям увеличить безопасность и надежность систем, а также повысить производительность устройств ввода/вывода в виртуальных средах.

Intel® VT-x с таблицами Extended Page Tables (EPT)

Intel® VT-x с технологией Extended Page Tables, известной также как технология Second Level Address Translation (SLAT), обеспечивает ускорение работы виртуализованных приложений с интенсивным использованием памяти. Технология Extended Page Tables на платформах с поддержкой технологии виртуализации Intel® сокращает непроизводительные затраты памяти и энергопотребления и увеличивает время автономной работы благодаря аппаратной оптимизации управления таблицей переадресации страниц.

Intel® TSX-NI

Intel® Transactional Synchronization Extensions New Instructions (Intel® TSX-NI) представляют собой набор команд, ориентированных на масштабирование производительности в многопоточных средах. Эта технология помогает более эффективно осуществлять параллельные операции с помощью улучшенного контроля блокировки ПО.

Архитектура Intel® 64

Архитектура Intel® 64 в сочетании с соответствующим программным обеспечением поддерживает работу 64-разрядных приложений на серверах, рабочих станциях, настольных ПК и ноутбуках.¹ Архитектура Intel® 64 обеспечивает повышение производительности, за счет чего вычислительные системы могут использовать более 4 ГБ виртуальной и физической памяти.

Набор команд

Набор команд содержит базовые команды и инструкции, которые микропроцессор понимает и может выполнять. Показанное значение указывает, с каким набором команд Intel совместим данный процессор.

Расширения набора команд

Расширения набора команд — это дополнительные инструкции, с помощью которых можно повысить производительность при выполнении операций с несколькими объектами данных. К ним относятся SSE (Поддержка расширений SIMD) и AVX (Векторные расширения).

Технология Intel® My WiFi

Технология Intel® My WiFi обеспечивает беспроводное подключение Ultrabook™ или ноутбука к устройствам с поддержкой WiFi, таким как принтеры, стереосистемы и т.д.

Состояния простоя

Режим состояния простоя (или C-состояния) используется для энергосбережения, когда процессор бездействует. C0 означает рабочее состояние, то есть ЦПУ в данный момент выполняет полезную работу. C1 — это первое состояние бездействия, С2 — второе состояние бездействия и т.д. Чем выше численный показатель С-состояния, тем больше действий по энергосбережению выполняет программа.

Enhanced Intel SpeedStep® Technology (Усовершенствованная технология Intel SpeedStep®)

Усовершенствованная технология Intel SpeedStep® позволяет обеспечить высокую производительность, а также соответствие требованиям мобильных систем к энергосбережению. Стандартная технология Intel SpeedStep® позволяет переключать уровень напряжения и частоты в зависимости от нагрузки на процессор. Усовершенствованная технология Intel SpeedStep® построена на той же архитектуре и использует такие стратегии разработки, как разделение изменений напряжения и частоты, а также распределение и восстановление тактового сигнала.

Технологии термоконтроля

Технологии термоконтроля защищают корпус процессора и систему от сбоя в результате перегрева с помощью нескольких функций управления температурным режимом. Внутрикристаллический цифровой термодатчик температуры (Digital Thermal Sensor — DTS) определяет температуру ядра, а функции управления температурным режимом при необходимости снижают энергопотребление корпусом процессора, тем самым уменьшая температуру, для обеспечения работы в пределах нормальных эксплуатационных характеристик.

Технология защиты конфиденциальности Intel®

Технология защиты конфиденциальности Intel® — встроенная технология безопасности, основанная на использовании токенов. Эта технология предоставляет простые и надежные средства контроля доступа к коммерческим и бизнес-данным в режиме онлайн, обеспечивая защиту от угроз безопасности и мошенничества. Технология защиты конфиденциальности Intel® использует аппаратные механизмы аутентификации ПК на веб-сайтах, в банковских системах и сетевых службах, подтверждая уникальность данного ПК, защищает от несанкционированного доступа и предотвращает атаки с использованием вредоносного ПО. Технология защиты конфиденциальности Intel® может использоваться в качестве ключевого компонента решений двухфакторной аутентификации, предназначенных для защиты информации на веб-сайтах и контроля доступа в бизнес-приложения.

Программа Intel® Stable Image Platform (Intel® SIPP)

Программа Intel® SIPP (Intel® Stable Image Platform Program) подразумевает нулевые изменения основных компонентов платформ и драйверов в течение не менее чем 15 месяцев или до следующего выпуска поколения, что упрощает эффективное управление конечными вычислительными системами ИТ-персоналом.
Подробнее о программе Intel® SIPP

Новые команды Intel® AES

Команды Intel® AES-NI (Intel® AES New Instructions) представляют собой набор команд, позволяющий быстро и безопасно обеспечить шифрование и расшифровку данных. Команды AES-NI могут применяться для решения широкого спектра криптографических задач, например, в приложениях, обеспечивающих групповое шифрование, расшифровку, аутентификацию, генерацию случайных чисел и аутентифицированное шифрование.

Secure Key

Технология Intel® Secure Key представляет собой генератор случайных чисел, создающий уникальные комбинации для усиления алгоритмов шифрования.

Технология Intel® Trusted Execution

Технология Intel® Trusted Execution расширяет возможности безопасного исполнения команд посредством аппаратного расширения возможностей процессоров и наборов микросхем Intel®. Эта технология обеспечивает для платформ цифрового офиса такие функции защиты, как измеряемый запуск приложений и защищенное выполнение команд. Это достигается за счет создания среды, где приложения выполняются изолированно от других приложений системы.

Функция Бит отмены выполнения

Бит отмены выполнения — это аппаратная функция безопасности, которая позволяет уменьшить уязвимость к вирусам и вредоносному коду, а также предотвратить выполнение вредоносного ПО и его распространение на сервере или в сети.

Технология Anti-Theft

Технология Intel® для защиты от краж помогает обеспечить безопасность данных на переносном компьютере в случае, если его потеряли или украли. Для использования технологии Intel® для защиты от краж необходимо оформить подписку у поставщика услуги технологии Intel® для защиты от краж.

Базовые операторы — SwiftBook

Оператор — это специальный символ или выражение для проверки, изменения или сложения величин. Например, оператор сложения (+) суммирует два числа let i = 1 + 2, а логический оператор И && объединяет два логических значения if enteredDoorCode && passedRetinaScan.

Язык Swift поддерживает большинство стандартных операторов C, а также ряд возможностей для устранения типичных ошибок в коде. Оператор присваивания (=) не возвращает значение, что позволяет избежать путаницы с оператором проверки на равенство (==). Арифметические операторы (+, -, *, /, % и т. д.) могут обнаруживать и предотвращать переполнение типа, чтобы числовой переменной нельзя было присвоить слишком большое или слишком маленькое значение. Контроль переполнения типа включается в Swift специальными операторами, которые описаны в разделе Операторы переполнения.

В отличие от C язык Swift позволяет делить с остатком (%) числа с плавающей точкой. Также в Swift имеются два сокращенных оператора интервала (a..<b и a…b), которых нет в C.

В этой главе описываются стандартные операторы Swift. Более сложные операторы Swift рассмотрены в главе Продвинутые операторы, где описано, как объявить пользовательские операторы и реализовать стандартные операторы для пользовательских типов.

Операторы делятся на унарные, бинарные и тернарные:

  • Унарные операторы применяются к одной величине (например, -a). Унарные префиксные операторы ставятся непосредственно перед величиной (например, !b), а унарные постфиксные операторы — сразу за ней (например, c!).
  • Бинарные операторы применяются к двум величинам (например, 2 + 3) и являются инфиксными, так как ставятся между этими величинами.
  • Тернарные операторы применяются к трем величинам. Как и в языке C, в Swift есть только один такой оператор, а именно — тернарный условный оператор (a ? b : c).

Величины, к которым применяются операторы, называются операндами. В выражении 1 + 2 символ + является бинарным оператором, а его операндами служат 1 и 2.

Оператор присваивания (a = b) инициализирует или изменяет значение переменной a на значение b:

let b = 10
var a = 5
a = b
// теперь a равно 10

Если левая часть выражения является кортежем с несколькими значениями, его элементам можно присвоить сразу несколько констант или переменных:

let (x, y) = (1, 2)
// x равно 1, а y равно 2

В отличие от C и Objective-C оператор присваивания в Swift не может возвращать значение. К примеру, следующее выражение недопустимо:

if x = y {
 // это неверно, так как x = y не возвращает никакого значения
}

Эта особенность не позволяет разработчику спутать оператор присваивания (=) с оператором проверки на равенство (==). Благодаря тому, что выражения типа if x = y некорректны, подобные ошибки при программировании на Swift не произойдут.

Язык Swift поддерживает четыре стандартных арифметических оператора для всех числовых типов:

  • сложение (+)
  • вычитание (-)
  • умножение (*)
  • деление (/)
1 + 2 // равно 3
5 - 3 // равно 2
2 * 3 // равно 6
10.0 / 2.5 // равно 4.0

В отличие от C и Objective-C арифметические операторы Swift по умолчанию не допускают переполнения типа. Контроль переполнения типа включается в Swift специальными операторами (например, a &+ b). Подробнее см. в главе Операторы переполнения.

Оператор сложения служит также для конкатенации, или же склейки, строковых значений (тип String):

"hello, " + "world"  // равно "hello, world"

Оператор целочисленного деления

Оператор целочисленного деления (a % b) показывает, какое количество b помещается внутри a, и возвращает остаток деления a на b.

Заметка

Оператор целочисленного деления (%) в некоторых языках называется оператором деления по модулю. Однако учитывая его действие над отрицательными числами в Swift, этот оператор, строго говоря, выполняет деление с остатком, а не по модулю.

Оператор целочисленного деления работает следующим образом. Для вычисления выражения 9 % 4 сначала определяется, сколько четверок содержится в девятке:

В одной девятке содержатся две четверки, а остатком будет 1 (выделено оранжевым цветом).

На языке Swift это записывается так:

9 % 4    // равно 1

Чтобы получить результат деления a % b, оператор % вычисляет следующее выражение и возвращает остаток:

a = (b × множитель) + остаток

где множитель показывает, сколько раз целых b содержится в a.

Подставляя в это выражение 9 и 4, получим:

9 = (4 × 2) + 1

Точно так же рассчитывается остаток, когда a отрицательно:

-9 % 4   // равно -1

Подставляя в наше выражение -9 и 4, получим:

-9 = (4 × -2) + -1

причем остаток будет равен -1.

Если b отрицательно, его знак отбрасывается. Это означает, что выражения a % b и a % -b всегда будут давать одинаковый результат.

Оператор унарного минуса

Для изменения знака числового значения служит префиксный минус -, который называется оператором унарного минуса:

let three = 3
let minusThree = -three // minusThree равно -3
let plusThree = -minusThree // plusThree равно 3, т. е. "минус минус три"

Оператор унарного минуса (-) ставится непосредственно перед значением, без пробела.

Оператор унарного плюса

Оператор унарного плюса (+) просто возвращает исходное значение без каких-либо изменений:

let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix равно -6

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

Как и в языке C, в Swift имеются составные операторы присваивания, совмещающие простое присваивание (=) с другой операцией. Одним из примеров может служить оператор присваивания со сложением (+=):

var a = 1
a += 2
// теперь a равно 3

Выражение a += 2 является краткой формой записи a = a + 2. Таким образом, один и тот же оператор выполняет одновременно операцию сложения и присваивания.

Заметка

Составные операторы присваивания не возвращают значение. К примеру, нельзя написать так: let b = a += 2.

Для получения полного списка операторов присваивания, предусмотренных стандартной библиотекой Swift, см. Operator Declarations.

Язык Swift поддерживает все стандартные операторы сравнения из C:

  • равно (a == b)
  • не равно (a != b)
  • больше (a > b)
  • меньше (a < b)
  • больше или равно (a >= b)
  • меньше или равно (a <= b)
Заметка

В языке Swift есть также два оператора проверки на идентичность/тождественность (=== и !==), определяющие, ссылаются ли два указателя на один и тот же экземпляр объекта. Дополнительную информацию см. в главе Классы и структуры.

Каждый оператор сравнения возвращает значение типа Bool, указывающее, является ли выражение истинным:

1 == 1 // истина, так как 1 равно 1
2 != 1 // истина, так как 2 не равно 1
2 > 1 // истина, так как 2 больше чем 1
1 < 2 // истина, так как 1 меньше 2
1 >= 1 // истина, так как 1 больше либо равно 1
2 <= 1 // ложь, так как 2 не меньше либо равно 1

Операторы сравнения часто используются в условных выражениях, включая инструкцию if:

let name = "world"
if name == "world" {
 print("hello, world")
} else {
 print("Мне жаль, \(name), но я тебя не узнаю")
}
// напечатает "hello, world", так как name очевидно равно "world"

Подробнее об инструкции if см. в главе «Управление потоком».

Вы так же можете сравнивать кортежи, которые имеют одно и то же количество значений, которые, в свою очередь, должны быть сравниваемыми, что означает, что кортеж типа (Int, String) может быть сравнен с кортежем такого же типа.
Кортежи сравниваются слева направо, по одному значению за раз до тех пор, пока операция сравнения не найдет отличия между значениями. Если все значения кортежей попарно равны, то и кортежи так же считаются равными. Например:

(1, "zebra") < (2, "apple")   // true, потому что 1 меньше 2, "zebra" и "apple" не сравниваются
(3, "apple") < (3, "bird")    // true , потому что 3 равно 3, а "apple" меньше чем "bird"
(4, "dog") == (4, "dog")      // true , потому что 4 равно 4 и "dog" равен "dog"

В примере выше, в первой строке вы можете видеть сравнение слева направо. Так как 1 меньше 2, то (1, “zebra”) меньше (2, “apple”), несмотря на остальные значения кортежа, потому что это неравенство было определено первыми членами. Не важно, что “zebra” не меньше, чем “apple”, потому что сравнение уже определено первыми элементами кортежей. Однако, когда первые элементы кортежей одинаковые, то сравниваются вторые элементы и так далее.

Кортежи могут сравниваться, только в том случае, если оператор сравнения можно применить ко всем членам кортежей соответственно. Например, как показано в коде ниже, вы можете сравнить два кортежа типа (String, Int) потому что и String, и Int могут сравниться оператором <. И наоборот, кортеж типа (String, Bool) сравниваться не может, так как к значениям типа Bool операторы сравнения не применяются.

("blue", -1) < ("purple", 1) // OK, расценивается как true
("blue", false) < ("purple", true) // Ошибка так как < не может применяться к значениям типа Bool 
Заметка

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

Тернарный условный оператор — это специальный оператор из трех частей, имеющий следующий синтаксис: выражение ? действие1 : действие2. Он выполняет одно из двух действий в зависимости от того, является ли выражение true или false. Если выражение равно true, оператор выполняет действие1 и возвращает его результат; в противном случае оператор выполняет действие2 и возвращает его результат.

Тернарный условный оператор является краткой записью следующего кода:

if выражение {
 действие1
} else {
 действие2
}

Ниже приведен пример расчета высоты строки в таблице. Если у строки есть заголовок, то она должна быть выше своего содержимого на 50 точек, а если заголовка нет, то на 20 точек:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight равно 90

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

let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
    rowHeight = rowHeight + 50
} else {
    rowHeight = rowHeight + 20
}
// rowHeight равно 90

В первом примере с помощью тернарного условного оператора величине rowHeight в одну строку присваивается правильное значение. Этот вариант не только короче второго примера, но и позволяет объявить величину rowHeight константой, так как в отличие от конструкции if ее значение не нужно изменять.

Тернарный условный оператор — это короткая и удобная конструкция для выбора между двумя выражениями. Однако тернарный условный оператор следует применять с осторожностью. Избыток таких коротких конструкций иногда делает код трудным для понимания. В частности, лучше не использовать несколько тернарных условных операторов в одном составном операторе присваивания.

Оператор объединения по nil (a ?? b) извлекает опционал a, если он содержит значение, или возвращает значение по умолчанию b, если a равно nil. Выражение a может быть только опционалом. Выражение b должно быть такого же типа, что и значение внутри a.

Оператор объединения по nil является краткой записью следующего кода:

a != nil ? a! : b

В вышеприведенном коде тернарный условный оператор и принудительное извлечение (a!) используются для обращения к значению внутри a, если a не равно nil, или для возвращения b в противном случае. Оператор объединения по nil — это более элегантный, короткий и понятный способ одновременно проверить условие и извлечь значение.

Заметка

Если a не равно nil, выражение b не анализируется. Такой подход называется краткой проверкой условия (short-circuit evaluation).

В следующем примере оператор объединения по nil выбирает между стандартным значением цвета и пользовательским:

let defaultColorName = "red"
var userDefinedColorName: String? // по умолчанию равно nil
        
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName равен nil, поэтому colorNameToUse получит значение по умолчанию — "red"

Переменная userDefinedColorName объявлена как строковый (String) опционал и по умолчанию равна nil. Так как userDefinedColorName является опционалом, ее значение можно анализировать посредством оператора объединения по nil. В вышеприведенном примере этот оператор задает начальное значение для строковой (String) переменной colorNameToUse. Так как userDefinedColorName равно nil, выражение userDefinedColorName ?? defaultColorName возвратит значение defaultColorName, т. е. «red».

Если переменной userDefinedColorName присвоить отличное от nil значение и снова передать ее в оператор объединения по nil, вместо значения по умолчанию будет использовано значение внутри userDefinedColorName:

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName не равно nil, поэтому colorNameToUse получит значение "green"

В языке Swift есть два оператора диапазона, которые в короткой форме задают диапазон значений.

Оператор замкнутого диапазона

Оператор замкнутого диапазона (a…b) задает диапазон от a до b, включая сами a и b. При этом значение a не должно превышать b.

Оператор замкнутого диапазона удобно использовать при последовательном переборе значений из некоторого диапазона, как, например, в цикле for-in:

for index in 1...5 {
 print("\(index) умножить на 5 будет \(index * 5)")
}
// 1 умножить на 5 будет 5
// 2 умножить на 5 будет 10
// 3 умножить на 5 будет 15
// 4 умножить на 5 будет 20
// 5 умножить на 5 будет 25

Подробнее о циклах for-in см. в главе Управление потоком.

Оператор полузамкнутого диапазона

Оператор полузамкнутого диапазона (a..<b) задает диапазон от a до b, исключая значение b. Такой диапазон называется полузамкнутым, потому что он включает первое значение, но исключает последнее. Так же, как и для оператора замкнутого диапазона, значение a не должно превышать b. Если значение a равно значению b, то итоговый диапазон будет пустым.

Операторы полузамкнутого диапазона особенно удобны при работе с массивами и другими последовательностями, пронумерованными с нуля, когда нужно перебрать элементы от первого до последнего:

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
 print("Person \(i + 1) будет \(names[i])")
}
// Person 1 будет Anna
// Person 2 будет Alex
// Person 3 будет Brian
// Person 4 будет Jack

Хотя в массиве четыре элемента, диапазон 0..<count доходит только до 3 (т. е. до номера последнего элемента в массиве), так как это оператор полузамкнутого диапазона. Подробнее о массивах см. в главе Массивы.

Односторонние диапазоны

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

for name in names[2...] {
    print(name)
}
// Brian
// Jack
 
for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

Оператор полузамкнутого диапазона так же имеет одностороннюю форму, которая записывается только с одним конечным значением. Точно так же как и в случае, когда вы включаете значение в обе стороны, конечное значение не является частью самого диапазона. Например:

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

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

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

Логические операторы изменяют или комбинируют логические значения типа Boolean (булево) — true и false. Язык Swift, как и другие C-подобные языки, поддерживает три стандартных логических оператора:

  • логическое НЕ (!a)
  • логическое И (a && b)
  • логическое ИЛИ (a || b)

Оператор логического НЕ

Оператор логического НЕ (!a) инвертирует булево значение — true меняется на false, а false становится true.

Оператор логического НЕ является префиксным и ставится непосредственно перед значением, без пробела. Как видно из следующего примера, его можно воспринимать как «не a»:

let allowedEntry = false
if !allowedEntry {
 print("ACCESS DENIED")
}
// Выведет "ACCESS DENIED"

Конструкция if !allowedEntry означает «если не allowedEntry». Идущая за ней строка будет выполнена, только если «не allowedEntry» является истиной, т. е. если allowedEntry равно false.

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

Оператор логического И

Оператор логического И (a && b) дает на выходе true тогда и только тогда, когда оба его операнда также равны true.

Если хотя бы один из них равен false, результатом всего выражения тоже будет false. На самом деле, если первое значение равно false, то второе даже не будет анализироваться, так как оно все равно не изменит общий результат на true. Такой подход называется краткой проверкой условия (short-circuit evaluation).

В следующем примере проверяются два значения типа Bool, и если они оба равны true, программа разрешает доступ:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
 print("Welcome!")
} else {
 print("ACCESS DENIED")
}
// Выведет "ACCESS DENIED"

Оператор логического ИЛИ

Оператор логического ИЛИ (a || b) является инфиксным и записывается в виде двух вертикальных палочек без пробела. С его помощью можно создавать логические выражения, которые будут давать true, если хотя бы один из операндов равен true.

Как и описанный выше оператор логического И, оператор логического ИЛИ использует краткую проверку условия. Если левая часть выражения с логическим ИЛИ равна true, то правая не анализируется, так как ее значение не повлияет на общий результат.

В приведенном ниже примере первое значение типа Bool (hasDoorKey) равно false, а второе (knowsOverridePassword) равно true. Поскольку одно из значений равно true, результат всего выражения тоже становится true и доступ разрешается:

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
 print("Welcome!")
} else {
 print("ACCESS DENIED")
}
// Выведет "Welcome!"

Комбинирование логических операторов

Можно также составлять и более сложные выражения из нескольких логических операторов:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
 print("Welcome!")
} else {
 print("ACCESS DENIED")
}
// Выведет "Welcome!"

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

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

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

Заметка

Логические операторы Swift && и || являются лево-ассоциированными, что означает, что составные выражения с логическими операторами оценивают в первую очередь выражения слева направо.

Явное указание круглых скобок

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

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
 print("Welcome!")
} else {
 print("ACCESS DENIED")
}
// Выведет "Welcome!"

Круглые скобки показывают, что первые две величины составляют одно из возможных значений всего логического выражения. Хотя результат составного выражения не изменится, такая запись сделает код понятнее. Читаемость кода всегда важнее краткости, поэтому желательно ставить круглые скобки везде, где они облегчают понимание.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Операторы ветвления. Урок 4 курса «Основы языка C»

if-else

В языке программирования C синтаксис оператора ветвления if-else выглядит так:

if (логич_выражение)
    выражение1;
else
    выражение2;

Как и в других языках ветка else не является обязательной.

В языке С в простых логических выражениях используются следующие знаки операторов: >, <, >=, <=, ==, !=.

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

if (логич_выражение) {
    выражение1;
    выражение2;
    …
}
else {
    выражениеN;
    …
}

В C можно использовать вложенные конструкции if-else. При этом рекомендуют вкладывать во внешнюю ветку else, а не if, т.к. это позволяет избегать неоднозначности толкования инструкции. Посмотрите на такую конструкцию:

if (…)
    if (…)
        …;
    else
        …;
else
    if (…)
        …;
    else
        …;

Для более легкого восприятия человеком отступами подчеркнуто, что куда вложено. Однако для компилятора с языка C отступы никакой роли не играют, и принадлежность первой ветки else не очевидна. Ее можно было бы ошибочно отнести к первому if, в результате чего второе else было бы вообще неуместным, т.к. не относилось бы ни к какому if. В данном случае такой ошибки не будет, т.к. компилятор руководствуется правилом: ветка else относится к ближайшему к ней сверху if, у которого еще нет ветки else. Именно поэтому здесь первое else относится ко второму if (т.к. оно к нему ближе), а второе else к первому if, т.к. второе if уже «покрыто» предыдущим else. Теперь посмотрите вот на такую конструкцию:

if (…)
    if (…)
       …;
else
    if (…)
       …;
    else
       …;

Программист отступами показал, что он хочет, чтобы первое else относилось к внешнему if. Однако компилятор, руководствуясь правилом отнесения веток else, расценит программу вот так (если перевести на удобство чтения ее программистом):

if (…)
    if (…)
         …;
    else
        if (…)
            …;
        else
            …;

При этом программа будет делать не то, что хотел программист: если в выражении при первом if будет возвращаться ложь, то ни один else просто не сработает. Однако в таких сложных случаях есть выход — это использование фигурных скобок, даже если тело условной инструкции состоит всего из одного выражения:

if (…) {
   if (…)
       …;
}
else
    if (…)
        …;
    else
        …;

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

Чаще всего на практике используется подобная конструкция множественного ветвления:

if (…) {
    …
} else if (…) {
    …
} else if (…) {
    …
} else {
    …
}

Здесь с точки зрения компилятора каждое else относится к предыдущему if, но выравнивание делается таким, как будто в Си есть условный оператор множественного ветвления. Результат работы конструкции таков, что выполняется хотя бы одна ветка. И как только она выполняется, вся конструкция завершает работу.

Условное выражение

В языке программирования C существует сокращенная запись инструкции if-else в виде условного выражения, которое относится к тернарным операторам. Результат такого выражения может быть присвоен переменной:

(логич_выражение) ? выражение1 : выражение2

Переводится это так. Если логич_выражение вернуло истину, то все выражение возвращает выражение1; если логич_выражение вернуло ложь, то все выражение возвращает выражение2. Например:

x = 12;
y = 16;
z = (x > y) ? x - 1 : y - 1;

Здесь z получит значение 15. Такое условное выражение бывает очень удобно, однако область его применения ограничена простейшими случаями ветвления, т. к. невозможно создавать сложные «тела» в такой конструкции.

Операторы И (&&) и ИЛИ (||)

Как известно логическое выражение может быть сложным. Логические операторы И и ИЛИ в языке программирования C обозначаются соответственно парными знаками амперсанда (&&) и вертикальной черты (||). Их приоритет меньше, чем у простых логических операторов, поэтому простые логические операции при их объединении в сложные логические выражения можно не заключать в скобки. Пример сложного логического выражения на языке C:

a > 100 && b != 0

Проверьте и объясните, что выводит функция printf(), если ей передать простые или сложные логические выражения. Например:

printf("%d\n", a == b && c < d);
printf("%d\n", c < d);

Оператор switch

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

switch (целочисленная_переменная) {
    case константа1:
        операции;
    case константа2:
        операции;
        ….
    default:
        операции;
}

В скобках после слова switch может стоять не только переменная, но и выражение, результат выполнения которого возвращает целое значение (может быть символ). Константы при case также могут быть результатом выполнения выражений. Константы можно группировать в одном case (например, case 12, 13, 18). Ветка default не обязательна.

При выполнении оператора switch, заданное значение в круглых скобках сравнивается с константами. Как только совпадение будет найдено, все последующие вложенные во все case операции начинают выполняться. Другими словами, выполняется не только кейс, где произошло совпадение, но и все нижележащие ветки case (и default тоже), константы которых не совпадают со значением при switch. Например, в результате выполнения вот такой программы:

int a = 1;
 
switch (a) {
    case 0: 
       printf("%d ", 0);
    case 1: 
        printf("%d ", 1);
    case 2: 
        printf("%d ", 2);
    default: 
        printf("%d ", -1);
}
 
printf("\n");

на экране будет выведено:

1 2 -1

, т. к. как только совпадение было обнаружено, все нижеследующие инструкции были выполнены.

Чтобы этого не происходило, в конце операций, принадлежащих определенному case, дописывают оператор break, который осуществляет принудительный выход из всей конструкции (в данном случае switch). Например:

int a=1;
 
switch (a) {
    case 0: 
        printf("%d\n", 0);
        break;
    case 1: 
        printf("%d\n", 1);
        break;
    case 2: 
        printf("%d\n", 2);
        break;
    default: 
        printf("%d\n", -1);
}

выведет только единицу, т. к. выполнение всей инструкции switch прервется после выполнения инструкции break при case 1.

Курс с решением части задач:
android-приложение, pdf-версия

Объединение условных операторов

Также известен как: Consolidate Conditional Expression

Проблема

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

Решение

Объедините все условия в одном условном операторе.

До

double disabilityAmount() {
  if (seniority < 2) {
    return 0;
  }
  if (monthsDisabled > 12) {
    return 0;
  }
  if (isPartTime) {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

После

double disabilityAmount() {
  if (isNotEligibleForDisability()) {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

До

double DisabilityAmount() 
{
  if (seniority < 2) 
  {
    return 0;
  }
  if (monthsDisabled > 12) 
  {
    return 0;
  }
  if (isPartTime) 
  {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

После

double DisabilityAmount()
{
  if (IsNotEligibleForDisability())
  {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

До

function disabilityAmount() {
  if ($this->seniority < 2) {
    return 0;
  }
  if ($this->monthsDisabled > 12) {
    return 0;
  }
  if ($this->isPartTime) {
    return 0;
  }
  // compute the disability amount
  ...

После

function disabilityAmount() {
  if ($this->isNotEligibleForDisability()) {
    return 0;
  }
  // compute the disability amount
  ...

До

def disabilityAmount():
    if seniority < 2:
        return 0
    if monthsDisabled > 12:
        return 0
    if isPartTime:
        return 0
    # Compute the disability amount.
    # ...

После

def disabilityAmount():
    if isNotEligibleForDisability():
        return 0
    # Compute the disability amount.
    # ...

До

disabilityAmount(): number {
  if (seniority < 2) {
    return 0;
  }
  if (monthsDisabled > 12) {
    return 0;
  }
  if (isPartTime) {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

После

disabilityAmount(): number {
  if (isNotEligibleForDisability()) {
    return 0;
  }
  // Compute the disability amount.
  // ...
}

Причины рефакторинга

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

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

Достоинства

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

  • Объединив все операторы в одном, вы позволяете выделить это сложное условие в новый метод с названием, отражающим суть этого выражения.

Порядок рефакторинга

Перед тем как осуществлять рефакторинг, убедитесь, что в условиях операторов нет «побочных эффектов», или, другими словами, они не модифицируют что-то, а только возвращают значения. Побочные эффекты могут быть и в коде, который выполняется внутри самого оператора. Например, по результатам условия, что-то добавляется к переменной.

  1. Объедините множество условий в одном с помощью операторов и и или. Объединение операторов обычно следует такому правилу:

    • Вложенные условия соединяются с помощью оператора и.

    • Условия, следующие друг за другом, соединяются с помощью оператора или.

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

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш интерактивный курс. Он гораздо более интересный, чем банальный текст.