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

«IT-специалист с нуля» наш лучший курс для старта в IT
Каждый оператор имеет свое написание (синтаксис) и семантику (содержание, смысл). В зависимости от конкретного языка синтаксис оператора может существенно различаться, хотя в целом для обозначения той или иной операции используются символы, имеющие аналогичное или похожее значение в математике или формальной логике.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

Зачем нужны операторы в программировании?
Компьютерная программа представляет собой алгоритм, то есть последовательность определенных действий с данными. Ее создает человек, но исполняет компьютер, поэтому она должна быть понятна им обоим. Поэтому просто описать определенную операцию, скажем, присваивания значения переменной обычным (естественным) языком, хоть и теоретически возможно, на практике очень неудобно. Для человека такой код будет очень громоздким и сложно воспринимаемым настолько, что написание сколько-нибудь большой программы станет невозможным. А чтобы код воспринимался компьютером, придется разработать сложный компилятор для его перевода на машинный язык.
Поэтому для обозначения операций в программировании были взяты символы, используемые в аналогичных языках в математических выражениях и формальной логике. Именно они стали основой для синтаксиса операторов в абсолютном большинстве современных ЯП. Таким образом, операторы в программировании выполняют следующие функции:
- упрощают и сокращают код, делают его более понятным человеческому восприятию;
- обозначают определенную операцию с данными таким образом, чтобы ее можно было легко перевести на машинный код.
Среди дополнительных преимуществ использования операторов можно выделить простое восприятие программы человеком независимо от того, носителем какого естественного языка он является. Это достигается за счет универсальности математических и логических символов.
Общее свойство операторов
Все операторы в программировании имеют одно общее свойство — они исполняются. То есть по своей сути они являются инструкциями, которым должен следовать компьютер, чтобы определенным образом обработать данные и выполнить программу. При этом сам оператор является чистой математической или логической абстракцией, под ним не подразумевается каких-либо конкретных объектов вроде ячеек памяти. На протяжении всего исполнения программы он остается в неизменном виде — зато изменяются данные, содержащиеся в памяти компьютера. Иными словами, эти изменения информации и являются исполнением команды, обозначенной оператором.
Виды операторов в программировании
В различных языках программирования имеются свои системы операторов и операций. Но в целом их можно классифицировать, разделив на несколько основных типов.
Оператор присваивания. Он используется в том случае, когда необходимо присвоить определенное значение переменной. То есть показать программе, что в данной ячейке памяти, обозначенной именем, лежат конкретные данные, которые нужно будет использовать в процессе исполнения кода. В большинстве языков программирования алгоритм присваивания использует знак равенства. Например, на языке Python данная операция выглядит следующим образом:
х = 365, где х — это имя переменной, 365 — ее значение, а «=» — знак присваивания.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Арифметические операторы. Это группа операторов, обозначающих математические действия с данными. В большинстве языков программирования они обозначаются символами, использующимися в том же значении в обычных арифметических управлениях, хотя некоторые из них могут иметь собственное обозначение — например:
- «-» — вычитание;
- «+» — сложение;
- «*» — умножение;
- «/» — деление без остатка;
- «—» — уменьшение;
- «++» — увеличение.
Два последних оператора из этого списка используются в языке С и обозначают уменьшение или увеличение операнды на 1. В других ЯП эта операция записывается, например, следующим образом: х = х + 1 или х = х – 1.
Логические операторы. Они помогают установить отношения между различными данными и/или обозначить условия, при которых будут выполняться какие-либо действия. Ключевой концепцией для их понимания является соотношение «правда/ложь» (true/false). Логические операторы по своей семантике и синтаксису базируются на формальной логике. В различных языках программирования их обозначение бывает разным, причем не только символьным, но и буквенным — например:
- Оператор «И» сравнивает несколько значений друг с другом и выдает результат «истина/ложь», от которого зависит дальнейшее выполнение программы. Результат «истина» возможен только в том случае, когда все значения истинны. Обозначается словом «and» или знаками &, &&.
- Оператор «ИЛИ» также сравнивает несколько значений друг с другом. Отличается от предыдущего тем, что выдает результат «ложь» только в том случае, когда все сравниваемые значения ложные. Обозначается словом «or», знаком ||.
- Оператор «НЕ» предназначен для замены значения на противоположное, то есть «истина» на «ложь» и наоборот. В программировании обозначается восклицательным знаком «!».
Операторы сравнения. Они часто используются в связке с логическими операторами для сравнения различных значений друг с другом, результатом чего является результат «истина/ложь». Например, в языке С они обозначаются следующими символами:
Помимо этих основных операторов в программировании используются и другие, причем в зависимости от языка их набор может существенно различаться, что влияет на возможности ЯП и гибкость написанного на нем кода. Часто в одном и том же языке сосуществуют операторы, обозначаемые словом или символом. Например, в языке Pascal наряду с символьным оператором присваивания «:=» присутствует оператор безусловного перехода «goto», записанный буквами латинского алфавита.
Все указанные выше команды являются простыми, то есть обозначающими одну конкретную операцию с данными. Помимо них в программировании используются составные операторы, то есть состоящие из нескольких простых. Соответственно, они имеют специальные обозначения для корректного написания в программе:
- Границы составного оператора могут обозначаться в различных языках фигурными скобками (в С или С++), словами «begin» и «end».
- Разделителем, отделяющим друг от друга простые операторы, входящие в состав сложного.
Составные операторы впервые появились в языке Алгол, из которого были унаследованы многими другими ЯП, такими как Pascal, C, C++ и т. д. Они позволяют использовать несколько операторов там, где ожидается применение одного — например, в операциях ветвления. Составные операторы позволяют упростить программный код и упорядочить его исполнение. Пример написания составного условного оператора «switch» (заменяющего множество простых операторов «if» на языке С:
switch(ii)
case 1: Buf_1[Pok-f+i]= Prognoz; break;
case 2: Buf_2[Pok-f+i]= Prognoz; break;
case 3: Buf_3[Pok-f+i]= Prognoz; break;
>
По своему назначению в структуре программы операторы можно разделить на следующие основные типы:
Операторы выбора. Они используются в тех случаях, когда программа подразумевает выбор из некоторого числа значений, в зависимости от которых происходит ее дальнейшее исполнение или неисполнение. Иными словами, они обозначают ветвление алгоритма. Типичным примером является оператор «if» в языке С, который разделяет программу на два сценария в зависимости от того, исполняется или нет указанное в нем условие.
Операторы цикла. С помощью таких операторов в программе обозначаются операции, выполняемые многократно (циклы). Они тоже содержат условия или параметры, при соблюдении которых цикл повторяется. В языке Pascal таким оператором является «while». Например, конструкция «while B do S» в переводе на естественный язык означает, что пока значение логического выражения (условия) B истинно, программа будет исполнять цикл S до тех пор пока B не станет ложным. В зависимости от того, как используется условие, операторы цикла можно разделить на 3 группы:
- с предусловием — то есть условием, соблюдение которого необходимо для осуществления цикла;
- В операторе с постусловием ситуация обратная — при выполнении условия цикл завершится;
- В операторе с параметром (переменной) вводится изменяемое значение, которое определяет конечное количество повторений цикла.
Операторы вызова процедуры. Под процедурами в программировании подразумевается подпрограмма (функциональный блок, входящий в основную программу). Фактически оператор вызова процедуры инициирует ее начало и определяет завершение по достижении нужных результатов. Таким образом, он позволяет сделать программу более понятной, а ее исполнение — последовательным и безошибочным.
Операторы перехода. Они перенаправляют исполнение программы к определенному фрагменту кода, помеченному специальной меткой. Операторы перехода позволяют создавать работающие алгоритмы со сложной структурой. Типичным примером такого оператора в языке Pascal является безусловный оператор «goto». Помимо него есть также оператор прерывания цикла «break» или досрочного завершения его текущей операции «continue», прерывания всей программы «exit» и т. д. Подобные операторы присутствуют и в других языках программирования, таких как С, С++, Java и т. д.
Порядок исполнения операторов
Для правильного использования операторов в программировании важно правильно задать последовательность их исполнения. Стандартным является вариант, когда простые и сложные операторы исполняются последовательно сверху вниз (если они расположены на разных строках) и справа налево (в одной строке). Так они и должны быть отражены в коде программы. Простые операторы, входящие в состав сложного (множественного), исполняются по тому же принципу. Однако такой принцип последовательности не единственный: в некоторых языках программирования есть возможность настроить его более гибко. Это зачастую ведет к усложнению структуры программы.
Таким образом, операторы в программировании являются одной из важнейших составляющих кода, минимальной функциональной единицей, без которой невозможно исполнение даже самой простой программы. Для их эффективного применения необходимо четко соблюдать правила синтаксиса, предусмотренные в конкретном языке, понимать смысл выполняемых операций и правильно задавать последовательность их исполнения.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Что такое пустой оператор и что он делает
Обычно каждая команда в любом языке программирования делает что-то полезное: создаёт переменные, присваивает значения, организует циклы и так далее. Но есть ещё пустые операторы — они ничего не делают, но ими часто пользуются. Рассказываем, как это работает и зачем применяется.
Что такое пустой оператор
Пустой оператор — это оператор, который не выполняет никакого действия. Когда компьютер встречает такое, он пропускает его и выполняет команды дальше.
Иногда бывает так, что программисту нужно сделать цикл или функцию, в которых пока ничего нет — например, чтобы быстро написать базовую логику, а потом заняться деталями. Если в Python мы попробуем создать пустую функцию и дальше продолжить писать основной код, то получим ошибку:

Python выдал ошибку IndentationError — он увидел, что мы объявили функцию, и ждал её содержимое на новой строке после отступа. С точки зрения компьютера, мы поступили неправильно: команда, которая относится к функции, записана неверно.
Чтобы выйти из такой ситуации, используют пустой оператор — в Python это команда pass. Её можно вставлять в коде в любое место, где требуется какое-то действие. Добавим эту команду в функцию и посмотрим на результат:

То же самое происходит и в циклах: если нам нужен цикл, который пока ничего не делает, достаточно добавить в него pass вместо настоящих команд:
for i in range(10): pass
Где ещё применяется пустой оператор
В новых обработчиках событий. В наших проектах мы часто создаём обработчики событий — функции, которые реагируют на происходящее: нажатие клавиш, нажатие кнопок на экране, движения мыши или загрузку элементов. При создании таких обработчиков часто используют заглушки — пустые обработчики, внутри которых ничего не происходит. Так делают, чтобы написать общую структуру программы, а потом наполнить её жизнью:
function onClickFunction () // здесь потом появится код
>
Для синхронизации потоков и разрешения блокировок. В Java есть метод wait() — он используется для приостановки потока до тех пор, пока не будет получен сигнал о его возобновлении. В этом случае пустой оператор можно использовать как условие ожидания такого сигнала:
synchronized (lock) < while (!condition) < try < // ожидание сигнала lock.wait(); >catch (InterruptedException e) < e.printStackTrace(); >> // пустой оператор >
В каких языках он есть
Пустой оператор есть почти во всех языках программирования, но выглядит он по-разному в зависимости от синтаксиса. Например, в C, C++ и JavaScript это точка с запятой, в Java этим могут быть фигурные скобки, а в Ассемблере это NOP.
Что плохого в пустом операторе
Пустой оператор — временное решение, поэтому как только его можно заменить на настоящие команды, это сразу нужно сделать. Дело в том, что иногда такой оператор может привести к таким ситуациям:
- У переменной могут появиться неопределённые значения. Если пустой оператор используется в цикле, то он никак не повлияет на переменную цикла или переменную в условии цикла. Это может привести к непредсказуемым последствиям.
- Сложность отладки — с пустым оператором не всегда понятно, где именно возникает ошибка.
- Нечитаемый код — если в программе много пустых операторов, то сложно понять, что именно делает код и как устроена внутренняя логика работы.
Что будет, если написать программу только из одних пустых операторов?
Так сделать, конечно, можно, но зачем?
При переводе в машинный код компьютер убирает из текста программы все пустые операторы, чтобы они не занимали место в памяти. В итоге программа из одних пустых операторов превратится в очень маленький код, который завершает работу сразу после запуска.
1. Операторы языка C++
Операторы управляют процессом выполнения программы. Набор операторов языка С++ содержит все управляющие конструкции структурного программирования.
-
Пустой оператор – ;
Тело оператора for выполняется до тех пор, пока условное выражение не станет ложным (равным 0). Начальное выражение и выражение приращения обычно используются для инициализации и модификации параметров цикла и других значений. Начальное выражение вычисляется один раз до первой проверки условного выражения, а выражение приращения вычисляется после каждого выполнения оператора. Любое из трех выражений заголовка цикла, и даже все три могут быть опущены (не забывайте только оставлять точки с запятой). Если опущено условное выражение, то оно считается истинным, и цикл становится бесконечным.
Оператора возврата заканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию. Управление передается в точку вызывающей функции, непосредственно следующую за оператором вызова. Значение выражения, если она задано, вычисляется, приводится к типу, объявленному для функции, содержащей оператор возврата, и возвращается в вызывающую функцию. Если выражение опущено, то возвращаемое функцией значение не определено.
Ввод/вывод не является частью языка С++ , а осуществляется функциями, входящими в состав стандартной библиотеки. Для подробной информации см. лекцию 4.
2. Структура программы
Программа на языке С++ состоит из директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций.
2.1. Объявление переменной
Объявление переменной задаёт имя и атрибуты переменной. Атрибутами переменной могут быть тип, количество элементов (для массивов), спецификация класса памяти, а также инициализатор. Инициализатор – это константа соответствующего типа, задающая значение, которое присваивается переменной при создании.
Объявление переменной имеет следующий синтаксис: [ ] [= ] [, [= ] . ];
В языке С++ нет ограничений на количество символов в имени. Однако некоторые части реализации (в частности, компоновщик) недоступны автору компилятора, и они иногда накладывают такие ограничения.
2.1.1. Константы
В языке С++ введена концепция определяемых пользователем констант для указания на то, что значение нельзя изменить непосредственно. Это может быть полезно в нескольких отношениях. Например, многие объекты не меняются после инициализации; использование символических констант приводит к более удобному в сопровождении коду, чем применение литералов непосредственно в тексте программы; указатели часто используются только для чтения, но не для записи; большинство параметров функций читаются, но не перезаписываются.
Типичным является использование констант в качестве размера массивов и меток в инструкции case.
Отметьте, что const модифицирует тип, т.е. ограничивает возможное использование объекта, но не указывает способ размещения константного объекта. Простым и типичным использованием константы является тот случай, когда значение константы известно во время компиляции и под неё не требуется выделение памяти. Для массива констант, как правило, требуется выделение памяти, так как, в общем случае, компилятор не в состоянии определить, к какому элементу массива происходит обращение в выражении.
2.1.2. Объявление typedef
Имена, вводимые с помощью typedef, являются синонимами, а не новыми типами. Следовательно, старые типы можно использовать совместно с их синонимами. Если вам нужны различные типы с одинаковой семантикой или с одинаковым представлением, обратитесь к перечислениям или классам.
2.2. Объявление и определение функции
Объявление функции задаёт имя функции, тип возвращаемого значения и количество и типы параметров, которые должны присутствовать при вызове функции. Указание void в качестве возвращаемого значения означает, что функция не возвращает значения.
Определением функции является объявление функции, в котором присутствует тело функции. Определение функции имеет следующий синтаксис:
( ) [ ] [ ] >
Типы в определении и объявлениях функции должны совпадать. Однако, имена параметров не являются частью типа и не обязаны совпадать.
Все функции в программе существуют на глобальном уровне и не могут быть вложены друг в друга.
Среди функций выделяется одна главная функция, которая должна иметь имя main. С нее начинается выполнение программы, обычно она управляет выполнением программы, организуя вызовы других функций. Для того чтобы программа могла быть скомпилирована и выполнена, она должна содержать, по крайней мере, определение функции main.
При вызове функции выделяется память под её формальные параметры, и каждому формальному параметру присваивается значение соответствующего фактического параметра. Семантика передачи параметров идентична семантике инициализации. В частности, проверяется соответствие типов формальных и фактических параметров и при необходимости выполняются либо стандартные, либо определённые пользователем преобразования типов. Существуют специальные правила для передачи массивов в качестве параметров, средства для передачи параметров, соответствие типов для которых не проверяется, и средства для задания параметров по умолчанию.
Такая форма инструкции return важна при написании шаблонов функций, когда тип возвращаемого значения является параметром шаблона.
2.2.1. Встраиваемые функции
Открытая подстановка не влияет на результаты вызова функции, чем отличается от макроподстановки. Встраиваемая функция имеет обычный синтаксис описания функции и подчиняется всем правилам, касающимся области видимости и контроля типов. Открытая подстановка является просто иной реализацией вызова функции. Вместо генерации кода, передающего управление и параметры единственному экземпляру тела функции, копия тела функции, соответственно модифицированная, помещается на место вызова. Это экономит время для передачи управления.
Для всех, кроме простейших, функций время выполнения функций доминирует над издержками времени на обслуживание вызова. Из этого следует, что для всех, кроме простейших, функций экономия за счёт открытой подстановки минимальна. Идеальным кандидатом для открытой подстановки является функция, делающая нечто простое, вроде увеличения или возврата значения. Существование таких функций вызывается необходимостью обработки скрытых данных.
2.2.2. Параметры функций по умолчанию
2.2.3. Параметры программы
Первый параметр содержит количество элементов в массиве – втором параметре, который является массивом указателей на строки. Каждая строка хранит один переданный программе параметр, при этом первый параметр (с индексом 0) содержит имя исполняемого файла и существует всегда. Порядок объявления параметров существенен.
2.2.4. Функции с переменным числом параметров
В языке С++ существует возможность использовать функции с переменным числом параметров. Для объявления такой функции надо указать многоточие (,…) в конце списка параметров функции. Для вызова такой функции не требуется никаких специальных действий, просто задается столько параметров, сколько нужно.
Во время интерпретации списка параметров такая функция пользуется информацией, не доступной компилятору. Поэтому он не в состоянии гарантировать, что ожидаемые параметры действительно присутствуют или что они имеют правильные типы. Ясно, что если параметр не был объявлен, компилятор не имеет информации, необходимой для выполнения стандартной проверки и преобразований типа.
Функцию только с необъявленными параметрами, в принципе, определить можно, но выбрать параметры будет затруднительно, т.к. макроопределения для работы с необъявленными параметрами используют имя последнего объявленного формального параметра.
Внутри функции программист сам отвечает за выбор из стека дополнительных параметров. Для работы с ними используются макроопределения va_arg , va_start и va_end , определённые в файле stdarg.h .
Пример программы с функцией с перменным числом параметров см. в конце лекции.
2.3. Препроцессор
- включение в программу текстов из указанных файлов;
- замена идентификаторов последовательностями символов;
- макроподстановка, т.е. замена обозначения параметризованным текстом, формируемым препроцессором с учетом конкретных аргументов;
- исключение из программы отдельных частей текста (условная компиляция).
2.3.1. Включение файлов
Включение файлов производиться с помощью директивы #include, которая имеет следующий синтаксис:
#include #include «путь»
Угловые скобки здесь являются элементом синтаксиса.
Директива #include включает содержимое файла, путь к которому задан, в компилируемый файл вместо строки с директивой. Если путь заключен в угловые скобки, то поиск файла осуществляется в стандартных директориях. Если путь заключен в кавычки и задан полностью, то поиск файла осуществляется в заданной директории, а если путь полностью не задан – в текущей директории. С помощью это директивы Вы можете включать в текст программы как стандартные, так и свои файлы.
Во включаемый файл можно поместить, например, общие для нескольких исходных файлов определения именованных констант и макроопределения. Включаемые файлы используются также для хранения объявлений внешних переменных и абстрактных типов данных, разделяемых несколькими исходными файлами. Более подробную информацию об использовании заголовочных файлов см. в лекции 9.
Кроме того, как было указано выше, в языке С++ ряд функций, такие как функции ввода/вывода, динамического распределения памяти и т.д., не являются элементом языка, а входят в стандартные библиотеки. Для того чтобы пользоваться функциями стандартных библиотек, необходимо в текст программы включать так называемые заголовочные файлы (в описании каждой функции указывается, какой заголовочный файл необходим для неё). Это также делается с помощью директивы препроцессора #include.
Директива #include может быть вложенной. Это значит, что она может встретиться в файле, включенном другой директивой #include. Допустимый уровень вложенности директив #include зависит от реализации компилятора.
2.3.2. Макроподстановки
Макроподстановки реализуются директивой #define, которая имеет следующий синтаксис:
#define #define ( )
Директива #define заменяет все вхождения идентификатора в исходном файле на текст, следующий в директиве за идентификатором. Этот процесс называется макроподстановкой. Идентификатор заменяется лишь в том случае, если он представляет собой отдельную лексему. Например, если идентификатор является частью строки или более длинного идентификатора, он не заменяется.
Текст представляет собой набор лексем, таких как ключевые слова, константы, идентификаторы или выражение. Один или более пробельных символов должны отделять текст от идентификатора (или от заключённых в скобки параметров). Если текст не умещается на строке, то он может быть продолжен на следующей строке, для этого следует набрать в конце строки символ «обратный слэш» и сразу за ним нажать клавишу «ВВОД».
Текст может быть опущен. В этом случае все экземпляры идентификатора будут удалены из исходного текста программы. Тем не менее, сам идентификатор рассматривается как определённый.
Список параметров, если он задан, содержит один или более идентификаторов, разделённых запятыми, и должен быть заключён в круглые скобки. Идентификаторы в списке должны отличаться друг от друга. Их область действия ограничена макроопределением, в котором они заданы. Имена формальных параметров в тексте отмечают позиции, в которые должны быть подставлены фактические аргументы макровызова.
В макровызове следом за идентификатором записывается в круглых скобах список фактических аргументов, соответствующих формальным параметрам из списка параметров. Списки фактически и формальных параметров должны содержать одно и то же количество элементов. Не следует путать подстановку аргументов в макроопределение с передачей аргументов функции. Подстановка в препроцессоре носит чисто текстовый характер. Никаких вычислений или преобразований типа при этом не производится.
После того как выполнена макроподстановка, полученная строка вновь просматривается для поиска других имен макроопределений. При повторном просмотре не принимается к рассмотрению имя ранее произведенной макроподстановки. Поэтому директива #define x x не приведет к зацикливанию препроцессора.
Вызов MULT(x + y, z) будет заменен на ((x + y) * (z)) . При отсутствии внутренних скобок получилось бы (x + y * z) , что неверно.
Макровызов MAX(i, a[i++]) заменится на ((i) > (a[i++])) ? (i) : (a[i++])) . Результат вычисления непредсказуем.
В директиве #define две лексемы могут быть «склеены» вместе. Для этого их нужно объединить знаками ## (слева и справа допустимы пробельные символы). Препроцессор объединяет такие лексемы в одну. Например, макроопределение #define VAR(i, j) i ## j при макровызове VAR(x, 6) образует идентификатор x6.
Символ #, помещаемый перед аргументом макроопределения, указывает на необходимость преобразования его в символьную строку. При макровызове конструкция # заменяется на » «.
Замены в тексте можно отменить директивой #undef, которая имеет следующий синтаксис:
#undef идентификатор>
Директива #undef отменяет действие текущего определения #define для идентификатора. Чтобы отменить макроопределение, достаточно задать его идентификатор. Задание списка параметров не требуется. Не является ошибкой применение директивы #undef к идентификатору, который ранее не был определён или действие которого уже отменено.
Принятая в С/С++ форма макросов является серьезным недостатком языка. Теперь эту форму можно считать устаревшей благодаря наличию более подходящих средств языка, таких как шаблоны, пространства имён, встраиваемые функции и константы. Точно также, широкое использование приведений типа в любом языке сигнализирует о плохом проектировании. Как макросы, так и приведения являются частыми источниками ошибок. Тот факт, что без них можно обойтись, делает программирование на С++ гораздо более безопасным и элегантным.
2.3.3. Условная компиляция
Условная компиляция обеспечивается в языке С++ набором команд, которые, по существу, управляют не компиляцией, а препроцессорной обработкой. Эти директивы позволяют исключить из процесса компиляции какие-либо части исходного файла посредством проверки условий.
#if [ ] [#elif [ ]] . [#else [ ]] #endif
Каждой директиве #if в том же исходном файле должна соответствовать завершающая её директива #endif. Между директивами #if и #endif допускается произвольное количество директив #elif и не более одной директивы #else. Если директива #else присутствует, то между ней и директивой #endif на данном уровне вложенности не должно быть других директив #elif.
Препроцессор выбирает участок текста для обработки на основе вычисления константного выражения, следующего за каждой директивой #if и #elif. Выбирается текст, следующий за константным выражением со значением «истина». Если ни одно ограниченное константное выражение не истинно, то препроцессор выбирает текст, следующий за директивой #else. Если же директива #else отсутствует, то никакой текст не выбирается.
Константное выражение может содержать препроцессорную операцию defined( ). Эта операция возвращает истинное значение, если заданный идентификатор в данный момент определён, в противном случае выражение ложно.
Зачем на съемочной площадке нужен оператор-постановщик?

Оператор-постановщик — одна из самых важных фигур на съёмочной площадке. Его первостепенная задача — воплотить на экране режиссерское видение и идею фильма, донести до зрителя эмоциональную окраску каждого эпизода. Для этого используются различные технические приёмы: хитрые ракурсы, смены точек зрения, колористические и светотональные решения. Например, ракурс снизу вверх расширяет плечи героев и придаёт основательности и решительности, а эффект «голландского угла», т.е заваленного горизонта, создаёт у зрителя ощущение тревоги и дискомфорта. Изменчивая перспектива объектов даже способна создать иллюзию медленного впадения в безумие. Получается, что оператор-постановщик умеет управлять эмоциональным состоянием зрителей, достигая необходимого эффекта для замысла режиссера.
Работа оператора-постановщика требует глубокого понимания материала, с которым ему придётся работать. Подготавливаясь к съемке фильма или ролика, оператор-постановщик работает над сценарием вместе с режиссёром и художником, пытаясь спланировать, как раскрыть творческий замысел режиссера. Именно на его плечи ляжет выбор мест съемок, утверждение эскизов и визуального стиля будущего фильма, проработка освещения и портретов персонажей. Будут ли персонажи ролика органично смотреться в кадре, как на них будет падать свет, как и когда будут использованы визуальные эффекты и музыка — всё это зависит от решений оператора-постановщика.

Не стоит забывать и о технической работе оператора-постановщика. Здесь на его плечи также ложится огромная ответственность. Необходимо выбрать тип и количество камер, проработать схему их движения, подобрать осветительную аппаратуру и оптические приборы. Фактически, он является вторым человеком по важности на съемочной площадке и руководит работой всей операторской группы.
Не путайте должность оператора-постановщика и оператора. Оператор — ближайший помощник оператора-постановщика, так же руководящий ассистентом оператора и другим техническим персоналом. Может самостоятельно проводить съёмки в павильоне и натуре при поручении оператора-постановщика. Отвечает за техническое качество изображения, комплектацию съёмочной техники, испытание аппаратуры, плёнки, фильтров и всего остального.
Таким образом получается, что профессия оператора-постановщика требует и художественного вкуса, и технических знаний и навыков. Люди этой профессии мыслят зрительными образами и воплощают их на экранах, используя магию освещения и видеоаппаратуры.

Кадр со съемок имиджевого ролика для Трубодетали
Когда вопрос касается видеороликов, не стоит думать, что ответственность и вклад оператора-постановщика уменьшаются, раз по времени они короче. Наоборот, ведь всего за несколько минут ему необходимо передать зрителям всю информацию, которую хочет донести режиссёр, договориться о местах съёмки и одобрить сопроводительную музыку. Всё это требует знаний, глубокого понимания процесса работы и, конечно, таланта. Ведь от качества операторской работы зависит успех всего видеоролика.
Посмотрите, что такое качественная операторская работа на примере наших рекламных видеороликов и корпоративных фильмов. Мы используем динамические камеры, продумываем освещение и композицию, а главное — всегда вкладываем в ролики душу.