В компьютерном программировании оператор — это синтаксическая единица императивного языка программирования , которая выражает некоторое действие , которое необходимо выполнить. [1] Программа , написанная на таком языке, состоит из последовательности одного или нескольких операторов. Оператор может иметь внутренние компоненты (например, выражения ).
Многие языки программирования (например , Ada , Algol 60 , C , Java , Pascal ) проводят различие между операторами и определениями/объявлениями . Определение или объявление определяет данные, с которыми должна работать программа, а оператор определяет действия, которые необходимо предпринять с этими данными.
Выражения, которые не могут содержать другие утверждения, являются простыми ; те, которые могут содержать другие утверждения, являются составными . [2]
Внешний вид оператора (да и программы) определяется его синтаксисом или грамматикой. Смысл высказывания определяется его семантикой .
Простые утверждения полны сами по себе; к ним относятся присваивания, вызовы подпрограмм и несколько операторов, которые могут существенно повлиять на поток управления программой (например, goto , return , stop/halt). В некоторых языках ввод и вывод, утверждения и выходы обрабатываются специальными операторами, в то время как в других языках используются вызовы предопределенных подпрограмм.
variable = expression
variable := expression;
variable = expression;
CALL subroutine name(parameters)
subroutine name(parameters);
assert(relational expression);
assert relational expression;
GOTO numbered-label
goto label;
goto label;
RETURN value
return value;
STOP number
exit(expression)
exit number;
Составные операторы могут содержать (последовательности) операторов, вложенных на любую разумную глубину, и обычно включают в себя тесты, позволяющие решить, следует ли подчиняться или повторять эти содержащиеся операторы.
begin <sequence> end
begin <sequence> end
{ <sequence> }
if test then <sequence> end if;
Многие составные операторы представляют собой команды цикла или команды выбора. Теоретически требуется только одна команда каждого из этих типов. На практике довольно часто встречаются различные частные случаи; они могут облегчить понимание программы, облегчить программирование и часто могут быть реализованы гораздо эффективнее. Здесь не упомянуто множество тонкостей; подробности см. в связанных статьях.
for index := 1 step 1 until limit do <statement> ;
for index := 1 to limit do <statement> ;
for ( index = 1; index <= limit; index += 1) <statement> ;
for index in 1..limit loop <sequence> end loop
Индекс DO = 1 , предел < последовательность > КОНЕЦ DO
for index := expression while test do <statement> ;
while test do <statement> ;
while (test) <statement> ;
while test loop <sequence> end loop
DO WHILE ( тест ) < последовательность > END DO
repeat <sequence> until test; { note reversed test}
do { <sequence> } while (test) ;
loop <sequence> exit when test; end loop;
do { <sequence> if (test) break; <sequence> } while (true) ;
loop <sequence> exit when test; <sequence> end loop;
if test then <unconditional statement> ;
if test then <statement> ;
if (test) <statement> ;
if test then <sequence> end if;
ЕСЛИ ( тест ) ТО < последовательность > КОНЕЦ ЕСЛИ
if test then <unconditional statement> else <statement> ;
if test then <statement> else <statement> ;
it (test) <statement> else <statement> ;
if test then <sequence> else <sequence> end if;
IF ( тест ) THEN < последовательность > ELSE < последовательность > END IF
case c of 'a': alert(); 'q': quit(); end;
case c is when 'a' => alert(); when 'q' => quit(); end case;
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
begin protected code except when exception specification => exception handler
try { protected code } catch (exception specification) { exception handler } finally { cleanup }
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
Помимо присваиваний и вызовов подпрограмм, в большинстве языков каждый оператор начинается со специального слова (например, goto, if, while и т. д.), как показано в приведенных выше примерах. Для описания формы высказываний на разных языках использовались различные методы; более формальные методы имеют тенденцию быть более точными:
BNF использует рекурсию для выражения повторения, поэтому были предложены различные расширения , позволяющие прямо указывать повторение.
Некоторые грамматики языков программирования резервируют ключевые слова или помечают их особым образом и не позволяют использовать их в качестве идентификаторов . Это часто приводит к тому, что грамматики легче анализировать и требуют меньшего просмотра .
Фортран и PL/1 не имеют зарезервированных ключевых слов, что позволяет использовать такие выражения, как:
IF IF = THEN THEN ...
(второе IF
и первое THEN
— переменные).IF (A) X = 10...
условный оператор (с другими вариантами)IF (A) = 2
присвоение индексной переменной с именемIF
DO 10 I = 1,5
начало цикла, где I работает от 1 до 5DO 10 I = 1.5
присвоение значения 1.5 переменнойDO10I
В Алголе 60 и Алголе 68 специальные токены выделялись явно: для публикации — жирным шрифтом, например begin
; для программирования с какой-либо специальной маркировкой, например, флажком ( 'begin
), кавычками ( 'begin'
) или подчеркиванием ( begin
на Elliott 503 ). Это называется «строппинг».
Таким образом, токены, являющиеся частью синтаксиса языка, не конфликтуют с именами, определенными программистом.
Некоторые имена зарезервированы как часть языка программирования и не могут использоваться в качестве имен, определяемых программистом. Большинство самых популярных языков программирования используют зарезервированные ключевые слова. Ранние примеры включают FLOW-MATIC (1953) и COBOL (1959). С 1970 года другие примеры включают Ada, C, C++, Java и Pascal. Количество зарезервированных слов зависит от языка: в C их около 30, а в COBOL — около 400.
Семантика связана со смыслом программы. В документах стандартов для многих языков программирования используется BNF или какой-либо его эквивалент для выражения синтаксиса/грамматики довольно формальным и точным способом, но семантика/значение программы обычно описывается с использованием примеров и английской прозы. Это может привести к двусмысленности. [8] В некоторых описаниях языков значение составных операторов определяется использованием «более простых» конструкций, например, цикл while может быть определен комбинацией проверок, переходов и меток с использованием if
и goto
.
В статье о семантике описываются несколько математических/логических формализмов, которые использовались для точного определения семантики; они, как правило, более сложны, чем BNF, и ни один подход не является общепринятым. Некоторые подходы эффективно определяют интерпретатор языка, некоторые используют формальную логику для рассуждения о программе, некоторые присоединяют аффиксы к синтаксическим объектам для обеспечения согласованности и т. д.
Часто проводится различие между операторами, которые выполняются, и выражениями , которые оцениваются. Выражения всегда возвращают значение, а операторы — нет. Однако выражения часто используются как часть более крупного утверждения.
В большинстве языков программирования оператор может состоять не более чем из выражения, обычно после выражения следует знак завершения оператора (точка с запятой). В таком случае, хотя выражение и оценивается как значение, полный оператор — нет (значение выражения отбрасывается). Например, в C, C++, C# и многих подобных языках x = y + 1
это выражение, которое присваивает x значение y плюс один, а само выражение в целом будет оцениваться как то же значение, что и x. Однако x = y + 1;
(обратите внимание на точку с запятой в конце) — это оператор, который по-прежнему присваивает x значение y плюс один, поскольку выражение внутри оператора все еще вычисляется, но результат выражения отбрасывается, а сам оператор не оценить любое значение. [9]
Выражения также могут содержаться внутри других выражений. Например, выражение x = y + 1
содержит выражение y + 1
, которое, в свою очередь, содержит значения y
и 1
, которые технически также являются выражениями.
Хотя в предыдущих примерах показаны выражения присваивания, некоторые языки реализуют присваивание не как выражение, а как оператор. Ярким примером этого является Python , где = — это не оператор, а просто разделитель в операторе присваивания. Хотя Python допускает множественные присваивания, поскольку каждое присваивание является выражением, это просто частный случай оператора присваивания, встроенного в грамматику языка, а не истинное выражение. [10]
Большинство языков имеют фиксированный набор операторов, определенный языком, но были эксперименты с расширяемыми языками , которые позволяют программисту определять новые операторы.