Выражение: Что-то, что оценивает к значению. Пример: оператор 1+2/x
: строка А кода, который делает что-то. Пример: GOTO 100
На самых ранних языках программирования общего назначения, как ФОРТРАН, различие было совершенно ясно. В ФОРТРАНЕ оператор был одной единицей выполнения, вещь, которую Вы сделали. Единственная причина это не назвали "строкой", состояла в том, потому что иногда это охватывало несколько строк. Выражение самостоятельно ничего не могло сделать..., что необходимо было присвоить его переменной.
1 + 2 / X
ошибка в ФОРТРАНЕ, потому что он ничего не делает. Необходимо было сделать что-то с тем выражением:
X = 1 + 2 / X
ФОРТРАН не имел грамматики, поскольку мы знаем это today— та идея была изобретена, наряду с Формой Бэкуса-Наура (BNF), как часть определения Алгола 60. В той точке семантический различие ("имеют значение" по сравнению с, "делает что-то"), хранился в [1 115] синтаксис : один вид фразы был выражением, и другой был оператором, и синтаксический анализатор мог сказать им независимо.
Разработчики более поздних языков размыли различие: они позволили синтаксическим выражениям делать вещи, и они позволили синтаксические операторы, которые имели значения. Самым ранним популярным примером языка, который все еще выживает, является C. Разработчики C поняли, что никакой вред не был причинен, если Вам разрешили оценить выражение и выбросить результат. В C каждое синтаксическое выражение может быть превращенным в оператор только путем прикрепления точки с запятой вдоль конца:
1 + 2 / x;
полностью законный оператор даже при том, что абсолютно ничего не произойдет. Точно так же в C, выражение может иметь побочные эффекты — это может изменить что-то.
1 + 2 / callfunc(12);
, потому что callfunc
мог бы просто сделать что-то полезное.
, Как только Вы позволяете любому выражению быть оператором, Вы могли бы также позволить оператор присваивания (=) в выражениях. Вот почему C позволяет Вам сделать вещи как [1 126]
callfunc(x = 2);
, Это оценивает выражение x = 2 (присвоение значения 2 к x) и затем передает это (2) к функции callfunc
.
Это размывание выражений и операторов происходит во всех C-производных (C, C++, C# и Java), которые все еще имеют некоторые операторы (как while
), но которые позволяют почти любому выражению использоваться в качестве оператора (в C# только присвоение, назовите, увеличьте, и декрементные выражения могут использоваться в качестве операторов; см. ответ Scott Wisniewski ).
Наличие двух "синтаксических категорий" (который является техническим именем для вида вещи, которая операторы и выражения) может привести к дублированию усилия. Например, C имеет две формы условного выражения, форма оператора
if (E) S1; else S2;
и форма выражения
E ? E1 : E2
, И иногда люди хотят дублирование, которое не является там: в стандарте C, например, только оператор может объявить новый локальный variable— но эта способность достаточно полезна, что компилятор C GNU обеспечивает расширение GNU, которое позволяет выражению объявить локальную переменную также.
Разработчикам других языков не нравился этот вид дублирования, и они видели рано на что, если выражения могут иметь побочные эффекты, а также значения, то синтаксический различие между операторами и выражениями не все это useful— таким образом, они избавились от него. Haskell, Значок, Lisp и ML являются всеми языками, которые не имеют синтаксического statements— у них только есть выражения. Даже класс структурировал цикличное выполнение, и условные формы считают выражениями, и у них есть values— но не очень интересные.
Попробуйте
Select
AVG(Cast(variable as Float)),
SUM(variable)
From
Table