|
Программирование >> Структурное программирование
18.11. Безусловный переход: оператор goto На протяжении всей этой книги мы подчеркивали важность использования методов структурного программирования, позволяющих создавать надежное программное обеспечение, которое легко отлаживать, поддерживать и модифицировать. Однако, в некоторых случаях эффективность работы программы бывает важнее, чем строгая приверженность методам структурного программирования. В таких случаях могут использоваться некоторые из неструктурных методов программирования. Например, мы можем использовать оператор break, чтобы завершить выполнение структуры повторения прежде, чем условие продолжения цикла примет значение ложь . Это избавит нас от ненужных повторений цикла, когда задача уже выполнена, а цикл еще не завершил своей работы. Другой пример неструктурного программирования - оператор безусловного перехода goto. В результате выполнения оператора goto управление передается первому оператору после метки, указанной в операторе goto. Метка - это идентификатор, за которым следует двоеточие. Метка должна находиться в пределах той же самой функции, что и оператор goto, который на нее ссылается. В программе на рис. 18.7 оператор goto используется для организации цикла из десяти проходов, в котором выводится значение счетчика count. После задания count начального значения 1 программа проверяет, не превысило ли значение count числа 10 (метка start пропускается, поскольку метки не выполняют никаких действий). Если значение count больше 10, то управление передается от оператора goto первому оператору после метки end. В противном случае, значение count выводится и увеличивается, а управление передается первому оператору после метки start. В главе 2 мы установили, что для написания любой программы достаточно трех управляющих структур: следования, выбора и повторения. Если придерживаться правил структурного программирования, то в некоторых случаях можно получить глубоко вложенные управляющие структуры, из которых потом будет трудно выбраться. Для быстрого выхода из таких глубоко вложенных структур некоторые программисты используют оператор goto, чтобы обойти многочисленные проверки выходов из управляющих структур. Совет по повышению эффективности 18.2 Оператор goto может использоваться для эффективного выхода из глубоко вложенных структур управления. Функция realloc имеет два аргумента: указатель на объект (ptr) и новый размер объекта (size). Если значение ptr ровно NULL, то realloc работает тождественно функции malloc. Если значение size равно О, а значение ptr не NULL, то занимаемая объектом память освобождается. В случае, когда значение ptr не NULL и значение size больше нуля, функция realloc будет пытаться выделить новый блок памяти для объекта. Если память не может быть выделена, то объект, на который указывает ptr, не изменяется. Функция realloc возвращает или указатель на выделенную область памяти, или NULL. 123456789 10 Рис. 18.7. При-менение oneparopagoto Замечание по технике программирования 18.3 Оператор goto должен использоваться только в приложениях, ориентированных на эффективную работу. Оператор goto не является инструментом структурного программирования и программы, в которых он используется, труднее отлаживать, поддерживать и модифицировать. 18.12. Объединения Объединение (union) - это область памяти, в которой в разные моменты времени могут находиться объекты разных типов. В любой момент времени объединение может содержать максимум один объект, потому что элементы объединения совместно используют одну и ту же область памяти. На программиста возлагается обязанность следить за тем, чтобы к данным в объединении обращались по имени элемента соответствующего типа данных. Типичная ошибка программирования 18.2 Результат обращения не к тому элементу объединения, который был последним размещен в памяти, не определен. Применение оператора goto #include <iostream.h> main() { int count = 1; start: метка if (count > 10) goto end; cout << count << ; ++count; goto start; end: метка cout endl; return 0; Замечание по мобильности 18.2 Если тип ссылки на элемент объединения не соответствует типу данных, хранящемуся в этот момент в объединении, то результат такой ошибки зависит от реализации системы. В разные отрезки времени выполнения программы некоторые объекты могут быть не нужны, т.е. программе требуется только часть ее объектов. Вместо того, чтобы впустую растрачивать память на объекты, которые используются не постоянно, можно поместить их в объединение, где они будут делить между собой одну и ту же область памяти. Число байтов памяти, выделяемых для объединения, должно быть не меньше, чем размер самого большого элемента объединения. Совет по повышению эффективности 18.3 Объединения помогают экономить память. Замечание по мобильности 18.3 Объем памяти, выделяемый объединению, зависит от реализации системы. Замечание по мобильности 18.4 Некоторые объединения не могут быть легко перенесены на другие компьютерные платформы. Перенесется ли объединение, или нет чаао зависит от соглашений о выравнивании в памяти типов данных элементов объединения. Объединения объявляются при помощи ключевого слова union в таком же формате, как структуры и классы. В следующем объявлении union Number { int х; float у; вводится тип объединения Number с элементами int х и float у. Объединения обычно определяются в программе до функции main для того, чтобы в любой функции программы можно было объявить переменные типа этого объединения. Замечание по технике программирования 18.4 Как и при объявлении аруктур и классов при помощи ключевых слов struct и class, объявление объединения с помощью ключевого слова union создает новый тип, а не объект. Объявление аруктуры или объединения вне определения какой-либо функции не создает глобального объекта. Единственными допустимыми встроенными операциями, которые могут выполняться над объединениями, являются: операция присваивания значения одного объединения другому объединению того же типа, операция вычисления адреса объединения (&) и доступ к элементу объединения при помощи операций доступа к элементу структуры (. и ->). Над объединениями
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |