Из трех выбранных вами языковых тегов я очень хорошо знаком с Python, но я полагаю, что многие другие языки имеют аналогичное представление об этих концепциях.Весь пример кода здесь Python.
A оператор - это вещь, которая выполняется;«инструкция сделать что-то», которую понимает языковая реализация.Например,
print "Hello World"
pass
def foo(n):
return n + 1
if condition:
print 'yay'
else:
print 'doh'
Вышеуказанный блок содержит оператор печати, оператор прохода, оператор определения функции и оператор if / else.Обратите внимание, что определение функции и оператор if / else являются составными операторами;они содержат другие операторы (возможно, многие из них, и, возможно, другие составные операторы).
выражение - это то, что может быть оценено для получения значения.например,
1
"foo"
2 * 6
function(argument)
None
Вышеприведенное содержит числовое литеральное выражение, строковое литеральное выражение, выражение, включающее числовые операторы, выражение вызова функции и литеральное выражение None.Помимо литералов и переменных, выражения состоят из других выражений.В function(argument)
, function
и argument
также являются выражениями.
Ключевым отличием является то, что операторы - это инструкции, которые говорят языковой реализации "пойти делать что-то".Выражения оцениваются по значению (что, возможно, требует от языковой реализации «идти делать что-то» в пути).
Следствием этого является то, что где бы вы ни увидели значение (включая выражение), вы можете заменитьлюбое другое выражение, и вы все равно получите что-то, что имеет какой-то смысл.Он может не скомпилироваться, или выдать исключения во время выполнения, или что-то еще, но, по крайней мере, на некотором уровне вы можете понять, что происходит.
Оператор может никогда появляться внутри выражения (Iполагаю, что в некотором смысле это не так в Ruby и Javascript, поскольку они допускают блоки и функции литерального кода, которые затем используются как значение в целом, а функции и блоки кода содержат операторы, но это отчасти отличается от того, что яговоря о).Выражение должно иметь значение (даже если оно неинтересное, например None
).Заявление - это команда;не имеет смысла отображать его как часть выражения, потому что оно не имеет значения.
Многие языки также допускают использование выражений в качестве операторов.Обычное значение этого слова - «оценить это выражение, чтобы получить значение, а затем выбросить его».В Python функции, которые всегда возвращают None
, обычно используются следующим образом:
write_to_disk(result)
Используется как «команда», поэтому выглядит как оператор, но технически это выражение, мы просто неt использовать значение, которое он оценивает для чего-либо.Вы можете утверждать, что «голое выражение» является одним из возможных утверждений в языке (и они часто анализируются таким образом).
Некоторые языки, хотя и различают функции, которые должны использоваться как операторы без возвратазначение (часто называемое процедурами) и функции, которые используются как выражение и дают вам ошибки или предупреждения при использовании функции, такой как выражение, и определенно дают ошибку при использовании процедуры в качестве выражения.
Итак, если foo
является выражением, я могу написать 1 + foo
, и хотя это может привести к ошибке типа, это, по крайней мере, имеет такой смысл.Если foo
является оператором, то 1 + foo
обычно является ошибкой разбора;языковая реализация даже не сможет понять, что вы пытаетесь сказать.
A функция , с другой стороны, это то, что вы можете вызвать.На самом деле это не выражение или утверждение само по себе.В Python вы используете оператор def
для создания функции, а вызов функции - это выражение.Имя, связанное с функцией после ее создания, также является выражением.Но сама функция представляет собой значение , которое не является точным выражением, когда вы получаете технический, но, безусловно, не является выражением.
Итак, для циклов.Это цикл for в Python:
for thing in collection:
do_stuff(thing)
Выглядит как оператор (составной оператор, как оператор if).И чтобы доказать это, это совершенно бессмысленно (и ошибка разбора):
1 + for thing in collection:
do_stuff(thing)
В некоторых языках, хотя цикл for равен выражению и имеет значение, к которому вы можете попытаться добавить 1. В некоторых это даже функция, а не специальный синтаксис, запеченный в языке.