В компьютерном программировании оператор — это синтаксическая единица императивного языка программирования , которая выражает некоторое действие, которое должно быть выполнено. [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> ;
if (test) <statement> else <statement> ;
if test then <sequence> else <sequence> 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 использует рекурсию для выражения повторения, поэтому были предложены различные расширения, позволяющие напрямую указывать на повторение.
Некоторые грамматики языков программирования резервируют ключевые слова или помечают их особым образом и не позволяют использовать их в качестве идентификаторов . Это часто приводит к грамматикам, которые легче анализировать , требуя меньшего количества предварительных просмотров .
В Fortran и 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,5DO10I
В Algol 60 и Algol 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]
Большинство языков имеют фиксированный набор операторов, определяемых языком, но проводились эксперименты с расширяемыми языками , которые позволяют программисту определять новые операторы.