Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 162
Текст из файла (страница 162)
П.1. Память, выделяемая для объединения 8 и структуры Т Объединение. Объединение (ип! оп) — это определение типа, синтаксически похожее на определение типа зггос1, но семантически эквивалентное вариантным записям языка Рааса! (раздел 61.6). Различие между типами оп! оп и бгбэсг показано на рис. П 1. В об ьединении 5 каждый его компонент имеет) значение такое же, Определяемые пользоеателем типы Язык С может создавать записи структурированных данных, называемые струк- турами, с помощью типа бггосц Синтаксис структур похож на синтаксис перечи- сляемых констант, описанных выше. Например, з1гост магу1апсс1азз (~пт з!ге; спаг ~пзтгистог(20];) см5с330. смбсбза, определяет структуру Магу1апбС1аэб, содержащую целый компонент юге и компо- нент ! пэтгисгог в виде массива из 20 символов, и объявляет две переменные СМЗСЗЗО и СМ5С630 типа Магу1апбС1 азз. А следующий оператор: зтгос1 Магу1апбС1азз СМ5С430; определяет новую переменную СМЗС430 типа Магу1апбС1аээ, ссылаясь на то же самое описание структуры.
К членам структуры доступ осушествляется с использовани- ем точечной нотации. Так, СМ5СЗЗО. 5!ге будет целочисленным компонентом з!ге этой структуры, а соответствукнцее имя СМ5СЗЗО. ! пбггис1ог будет компонентом ! п51гос1ог этой же структуры. Объявление записи с помощью конструкции зтгост создает новый тип. Пара- доксальноо, но объявление ту ребе( на самом деле является просто подстановкой име- ни, но новый тип оно не создает. Соответственно тураоет !п1 пан!пт. определяет, что тип пеи~ пт является таким же, как и тип ! пт.
Обычно такое описа- ние используется при определении структур 51гост. Так, во фрагменте туресеГ зтгис1 НенС1аьз 1, ) Магу1апСС1азз; Магу]апбС1азз А, Магу1апОС1азз В: определяется новое имя Магу1апбС1аэа для структурного типа МеьС!абэ, и с помо- щью нового имени типа переменные А и В объявляются как принадлежа!цие также к структурному типу МеиС1а55.
586 Приложение, Обзоры языков как и Рзначение самого объединения з. Каждый компонент располагается в одной и той же области памяти. В структуре Т Кзначение компонента А то же самое, что и у нее самой, но все рзначения остальных компонентов отличны от рзначения структуры Т. Каждый компонент располагается в своей собственной области памяти. Представление объектов в памяти. Целые, вещественные с плавающей точкой и символьные данные хранятся в своем естественном формате, а массивы не требуют дескрипторов.
Указатели являются просто Рзначениями объектов, на которые они указывают. Накладные расходы при доступе к этим объектам незначительны. Указатели и массивы тесно связаны. К массиву пт П()О] также можно получить доступ как к указателю: тпт *аггвургг, аггауртг - вп(О): т'* вггвуртг указывает кв Я(0] *у Выражение*((аггаургг) + (т)) имееттожезначение, что из(т]. Если т) — это структура вггисс: втгост т) ( тпг д, тпт Ь, ) тогда последовательность в)гост тт *р; р = Ытгост П *) ва11осбмзеоцзтгосг П)); как и в предыдуп1ем примере, выделяет память для структуры т) и сохраняет ее адрес в переменной-указателе р. Для доступа к компонентам этой структуры используется операция в (которая записывается как ->).
На компонент з ссылаются следуютцим обра:юм: р в а; а на компонент Ь вЂ” р — > Ь. Обратите внимание на то, что р — > з есть пточттогтитожесамос, что и (*р) а. Иттициалиаация. Любую статически размещаемую переменную можно инициализировать следующим образом: тпт т=!2. Если нужно инициализировать массив, то задается список элементов: тпт а(4) = (1.
2. 3, 4), спаг зтюпд(4] . "аЬс"; В последнем примере массив вггтпо инициализируется как аЬс)0. В массиве должно быть зарезервировано место под завершающий ппП-сиьтвол. П.2.2. Управление последовательностью действий Выражения Одна из сильных сторон языка С вЂ” это наличие множества операций, которые могут обрабатывать числовые данные. (Одновременно это является и его слабым местом, потому что теперь суп1сствует много способов выполнить аналогичные операции ) Множество операций языка С и уровни их приоритетов были приведены ранее, в табл. 8.2, Важно помнить о различии между поразрядными и логпческими операциями. Операция поразрядного логического И в выражении 584 приведет к результату, рав- ному значению 4, поскольку эта операция выполняет логическое И для каждого бита отдельно: 5 $ 4 = 0101 $ 0100 = 0100 = 4 Операция логического И в выражении 5 00 4 приведет к значению 1, поскольку она выполняется следующим образом: а аа Ь = т( а = 0 тпеп 0 е1ве тт Ь - О тпеп 0 е1ве 1 Другие логические операции выполняются подобным же образом.
Они всегда возвращают значение 0 нли 1. Выражение т( (а = Ь) присваивает значение Ь переменной а и возвращаетзначенпе а. Будьте внимательны — если вы имеете в виду проверку равенства двух переменных, используйтс )0 (а==Ь). Приведение типов. Обычно приведение типов встречается тогда, когда не происходит потери информации, как прп переходе от типа спас к типу тпс. Приведение значения к новому типу можно осуществить, если поставить перед ним унарную операция приведения типа.
Так, а + (тпт)Ь сначала приведет Ь к типу тп(, а потом прибавит Ь к а. Операторы Блоки. Последовательность (списон операторов~ можно использовать везде, тле необходим оператор. Также в каждом блоке можно объявить локальные переменные: (тпт т, 0: Однако, как отмечалось в разделе 9.4.2, память под переменные т и 0 будет отведена в тот момент, когда будет отводиться память нод всю процедуру, содержащую этот блок. Выражения-операторы. Любое выражение можно использовать в качестве оператора. В частности, оператор присваивания а = Ь в действителыюсти есть выражение присваивания.
Условные операторы. В языке С имеются обычные конструкции )Г Фцеп и тт ЬЬеп е!ве: тт тпеп т( (выражение) оператор 1( тпеп е1ве тт (выражение) оператор е1ве оператор Во вложенных операторах т ( оператор е1ве ассоциируется с ближайшим к нему т б Операторы цикла. В языке С существует три оператора цикла — ыц)1е, т)о и 0ог; + ыЬ)10: ып)1е(выражение) оператор; означает, что следует выполнять оператор до тех пор, пока выражение остается истинным. + т)о: Оо оператор ып)1е(выражение); означает выполнить оператор, а затем проверить выражение.
Если оно истинно, то повторить оператор 00. Таким же оператором цикла является оператор гереас ыпв)1 в языке Разса1 и некоторых других языках; отличие заключается лишь в том, что цикл продолжается, если тестовое выражение истинно. + 0ог:0ог(выражение,: выражение,: выражение,) оператор: являетсяформойитерации и выполняется следующим образом. Е Если задано выражениео то оно вы шсляется. Часто (но не обязательно) это оператор инициализации, например 3=0.
888 Приложение. Обзоры языков 2. Если задано виражениеп то оно вычисляется. Если результат равняется 0, то цикл ~ог завершается. Обычно выражение, определяет условие прекращения цикла, например 0<10, 3. Выполняется оператор. 4. Если задано выражениен то оно вычисляется. Обычно это приращение переменной — счетчика цикла, например 3++ или просто прибавление 1 к 0. 5. Процесс повторяется с шага 2. Оператор ви1ссЬ. Действие оператора витссГ подобно многовариантному ветв- лению; часто он называется оператором саве. Его синтаксис следующий: вн(тсывнранение) (саве константа,; список операторов,: Ьгеаи: саве коне~апта,: списан операторов„: Ьгеаи: саве константа,: Оетао)т. список операторов„ ) После того как вычисляется выражение, управление переходит к метке саве со значением константы, равной вычисленному значению выражения, или к опера- тору т)е1ао(с, если ни одна константа не совпадает с полученным значением втнра- жения.
В данном случае очень важен оператор Ьгеа~, и это является действительно сла- бым местом языка С, поскольку если отсутствует явная передача управления по- сле операторов одной метки саве, то будут выполнены операторы и всех последую- щих меток саве. Операторы передачи управления. В языке С существуют четыре оператора, передаютцих управление, — это ьгеак, сопстпие, досо и геьвгп. Оператор Ьгеа1 вызывает завершение ближайшего к нему из операторов нШ1е, бо, рог или си1 Ьсп, в которые он вложен. По существу, это оператор доЬо, передаю- щий управление первому оператору, который следует за составным оператором, содержащим оператор Ьгеа1.
Как отмечалось ранее, этот оператор очень важен для предотвратцения последовательного продолжения выполнения ветвей саве в опе- раторе вн1Ьси. Оператор сопс(пое передает управление в конец тела цикла непосредственно содержащего его оператора тог, т)о или нП11е. Это приводит к тому, что программа переходит к следующей итерации соответствующего цикла. Оператор досо нетка передает управление оператору, помеченному указанной меткой. Как и в языке ЕОКТЕА)к), это слабый оператор, его использование необя- зательно и лучше им вообще не пользоваться. Вложенные в операторы цикла опе- раторы Ьгей и сопт1пое обеспечивают все необходимые механизмы передачи управления.
Оператор гехогп осуществляет возврат из процедур. Если процедура вызыва- лась как функция, то синтаксис выглядит следующим образом: геьвгп выражение. Команды преп роцессора. Ключевые слова т)ет т пе, т 11)ей т 1пбет, 1пс1ос)е, т 1, опт)е1 и е1ве, начинающиеся с символа №, являются командами ил и директивами препро- цессора и не имеют никаких других функций в языке С, В старых версиях транс- лятора С символ № обязательно должен был являться первым символом в строке, однако в большинстве современных трансляторов перед этим символом допуска- ются пробелы. Директива №т)е№)пе именует последовательность лексем, например: №Сеттле иня последовательность лелеем Именованные константы могут быть определены следукпцим образом; №Сеттпе ТВОЕ 1 Обратите внимание на то, что запись №оеттле ТВОЕ - 1 неправильна, поскольку в этом случае значение константы ТВОЕ будет = 1, а не 1, Директиву №т)е№т пе также можно использовать для создания макроопределений, например: №оеттпе иияЕЧаг,, Чаг,..., Чаг„) последовательность ленсем где Чаг при использовании заменяются истинными аргументами, например; №оеттпе аов(А.