Неявные описания

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

21. Неявные описания

Не всегда является необходимым специфицировать и класс

памяти и тип идентификатора в описании. Во внешних определе-

ниях и описаниях формальных параметров и членов структур

класс памяти определяется по контексту. Если в находящемся

внутри функции описании не указан тип, а только класс памя-

ти, то предполагается, что идентификатор имеет тип INT; если

не указан класс памяти, а только тип, то идентификатор пред-

полагается описанным как AUTO. Исключение из последнего пра-

вила дается для функций, потому что спецификатор AUTO для

функций является бессмысленным (язык “C” не в состоянии ком-

пилировать программу в стек); если идентификатор имеет тип

“функция, возвращающая ...”, то он предполагается неявно

описанным как EXTERN.


·     219 -

Входящий в выражение и неописанный ранее идентификатор,

за которым следует скобка ( , считается описанным по контек-

сту как “функция, возвращающая INT”.

22. Снова о типах

В этом разделе обобщаются сведения об операциях, которые

можно применять только к объектам определенных типов.

22.1. Структуры и объединения

Только две вещи можно сделать со структурой или объеди-

нением: назвать один из их членов (с помощью операции) или

извлечь их адрес ( с помощью унарной операции &). Другие

операции, такие как присваивание им или из них и передача их

в качестве параметров, приводят к сообщению об ошибке. В бу-

дущем ожидается, что эти операции, но не обязательно ка-

кие-либо другие, будут разрешены.

В п. 15.1 Говорится, что при прямой или косвенной ссылке

на структуру (с помощью . Или ->) имя справа должно быть

членом структуры, названной или указанной выражением слева.

Это ограничение не навязывается строго компилятором, чтобы

дать возможность обойти правила типов. В действительности

перед '.' допускается любое L-значение и затем предполагает-

ся, что это L-значение имеет форму структуры, для которой

стоящее справа имя является членом. Таким же образом, от вы-

ражения, стоящего перед '->', требуется только быть указате-

лем или целым. В случае указателя предполагается, что он

указывает на структуру, для которой стоящее справа имя явля-

ется членом. В случае целого оно рассматривается как абсо-

лютный адрес соответствующей структуры, заданный в единицах

машинной памяти.

Такие структуры не являются переносимыми.

22.2. Функции

Только две вещи можно сделать с функцией: вызвать ее или

извлечь ее адрес. Если имя функции входит в выражение не в

позиции имени функции, соответствующей обращению к ней, то

генерируется указатель на эту функцию. Следовательно, чтобы

передать одну функцию другой, можно написать

 

INT F();

...

G(F);

Тогда определение функции G могло бы выглядеть так:

G(FUNCP)

INT(*FUNCP)();

 \(

...

(*FUNCP)();

...

 \)

 

Обратите внимание, что в вызывающей процедуре функция F дол-

жна быть описана явно, потому что за ее появлением в G(F) не

следует скобка ( .


·     220 -

22.3. Массивы, указатели и индексация

Каждый раз, когда идентификатор, имеющий тип массива,

появляется в выражении, он преобразуется в указатель на пер-

вый член этого массива. Из-за этого преобразования массивы

не являются L-значениями. По определению операция индексация

[] интерпретируется таким образом, что E1[E2] считается

идентичным выражению *((е1)+(е2)). Согласно правилам преоб-

разований, применяемым при операции +, если E1 - массив, а

е2 - целое, то е1[е2] ссылается на е2-й член массива е1. По-

этому несмотря на несимметричный вид операция индексации яв-

ляется коммутативной.

В случае многомерных массивов применяется последователь-

ное правило. Если е является N-мерным массивом размера

I*J*...*K, то при появлении в выражении е преобразуется в

указатель на (N-1)-мерный массив размера J*...*K. Если опе-

рация * либо явно, либо неявно, как результат индексации,

применяется к этому указателю, то результатом операции будет

указанный (N-1)-мерный массив, который сам немедленно преоб-

разуется в указатель.

Рассмотрим, например, описание

INT X[3][5];

Здесь X массив целых размера 3*5. При появлении в выражении

X преобразуется в указатель на первый из трех массивов из 5

целых. В выражении X[I], которое эквивалентно *(X+I), снача-

ла X преобразуется в указатель так, как описано выше; затем

I преобразуется к типу X, что вызывает умножение I на длину

объекта, на который указывает указатель, а именно на 5 целых

объектов. Результаты складываются, и применение косвенной

адресации дает массив (из 5 целых), который в свою очередь

преобразуется в указатель на первое из этих целых. Если в

выражение входит и другой индекс, то таже самая аргументация

применяется снова; результатом на этот раз будет целое.

Из всего этого следует, что массивы в языке “C” хранятся

построчно ( последний индекс изменяется быстрее всего) и что

первый индекс в описании помогает определить общее количест-

во памяти, требуемое для хранения массива, но не играет ни-

какой другой роли в вычислениях, связанных с индексацией.


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх