AVG в Sql - проблема числа Плавающая

Выражение: Что-то, что оценивает к значению. Пример: оператор 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— но не очень интересные.

29
задан NetSide 9 July 2009 в 07:48
поделиться