Лекция 08 (1160808), страница 3
Текст из файла (страница 3)
{…
goto end;
…
end: чистка ресурсов
}
В современных ЯП применяются специального вида конструкции, а именно исключительные ситуации и вместо перехода по метке происходит выброс (возбуждение) соответствующей исключительно ситуации: throw(исключительная ситуация). Потом обсудим. Наличие концепции исключений практически полностью ликвидирует необходимость использования операторов перехода. В С++:
{
C1 a; //объект класса С1
…
goto end;
C2 b;
end: …
}
Деструкторы классов занимаются чисткой ресурсов. В С++ деструкторы локальных объектов выполняются автоматически в конце каждого блока. И теперь мы точно не знаем деструкторы каких объектов запускать. Компилятор С++ выдаст паническое сообщение, что деструктор будет игнорироваться. Но программисты не любят, когда им что-то запрещают, поэтому C# на всякий случай поддерживает оператор перехода.
4)Составной оператор – это частный вид блока.
блок = {[объявления;]операторы}
begin … end
Если объявления отсутствуют, то такая конструкция и называется составным оператором. Но смешивать операторы и объявления не очень хорошо, поэтому, начиная с языка Паскаль, Вирт определяет под блоком несколько другую структуру:
блок = объявления и составной оператор.
Например, тело программы:
заголовок программы
объявления
begin
end
И любая процедура состоит из заголовка, объявлений и составного оператора. Если у нас язык без терминаторов, то составной оператор просто необходим. Иначе необходимость в составном операторе просто исчезает. С этой точки зрения языки с терминаторами ортогональны (там, где может стоять один оператор, может стоять и группа операторов). В тоже время концепция блока остаётся во всех языках.
объявления
begin
операторы
end
В таких языках как Модула 2 и Ада begin end в отдельную синтаксическую конструкцию не выделяется. В Аде ещё всегда перед началом блока (не того, который тело процедуры или функции, а вложенного блока) стоит слово declare.
Блоки отмечают объявления локальных переменных внутри кода, что, вообще говоря, не есть очень хорошо. Тут есть два стиля: стиль С++: «объявляй переменные там, где они тебе нужны», в результате операторы и объявления переменных смешиваются. И стиль языков Паскалевского типа, а именно то, что переменные нужно объявлять в начале какого-то блока и перемешивать объявления и операторы нельзя. Ада придерживается смешенного типа. Составной оператор теряет свою значимость.