YAQAPD: еще один вопрос о направлении синтаксического анализа
Каждый язык программирования имеет свои правила.Направление разбора является одним из них.Позвольте мне объяснить более подробно (наберитесь терпения).
Предположим, что вы пишете следующую функцию в Pascal / Delphi:
function Sum2Numbers (n1, n2:integer) : integer;
begin
result:=n1+n2;
end;
Теперь эта же функция в C:
int function Sum2Numbers (int n1, int n2)
{
return (n1+n2);
}
Для точки зрения программистаобе функции делают одно и то же (и действительно делают).Однако за кулисами каждый компилятор работает по-своему.
Pascal / Delphi и многие другие языки компилируют код, анализируя текст слева направо.Итак, когда мы вызываем функцию в Pascal или Delphi, компилятор помещает в стек сначала n1
, а затем n2
.Та же самая функция в C делает это от RIGHT TO LEFT, т.е. компиляторы помещают в стек сначала n2
, а затем n1
.
Оба компилятора читают параметры из стека в порядке, который они знают, поэтому все работает нормально.
Все языки "семейства C" (C, C ++, Managed C ++, C ++ / CLI, C #, ...) используют порядок синтаксического анализа кода ПРАВО НА ВЛЕВО.
Это причина, по которой ограничение new()
ДОЛЖНО быть указано в ПРАВИЛЬНО В ДАЛЬНЕЙШЕМ списке ограничений.
Компилятор должен знать IN ADVANCE, что ему потребуется для создания экземпляров классов, ДО того, как их использовать.