Язык программирования Си. Глава(Chapter) 12
Tags: c, russian
Published: 2022-06-24 17:57:26

1. В C объект(не экземпляр класса) - это аппаратный(hardware) аспект участка памяти, который имеет соответствующий определённому типу размер и может сохранять одно или несколько значений, а программный(software) аспект - это идентификатор(identifier), имя переменной(variable name)(int arr[10]; arr - объект из 10 объектов типа int), или выражение(expression), которое обозначает(designates) объект(ptr + 2 * COLS;(не объект, l-value), *(ptr + 2 * COLS);(модифицируемый(modifiable) l-value)

2. Область видимости(Scope): в пределах блока, всё внутри {}(переменная объявленная внутри блока и формальные параметры функции), также в пределах функции(метка(label) goto, то есть start: достижима из любого блока функции), ещё в пределах прототипа функции(имена параметров, которых может и не быть, не важны, но не должны переопределяться в этой области видимости) и наконец, в пределах файла(file) или единицы трансляции(translation unit)(файл после вставки всех функций заголовочных файлов препроцессором), иначе просто глобальные переменные(global variables)

3. Связывание(Linkage) есть только у объектов с областью видимости в пределах файла: внешнее(external), иначе глобальная область видимости(global scope) или область видимости в пределах программы(program scope), виден в любом месте многофайловой программы, также внутреннее(internal), иначе область видимости в пределах файла(file scope), виден в единице трансляции(используется static). Отсутствует у переменных в блоке, функций и прототипов функций

4. Продолжительность хранения(Storage Duration): статическая(static), инициализируется одиножды при компиляции(автоматически нулём, а иначе константным значением), а хранится от загрузки до завершения программы с областью видимости в пределах файла, можно и в блоке(используется static), потоковая(thread) существует с момента объявления объекта и до завершения потока(используется _Thread_local), автоматическая(automatic)(реализован как стек(stack)) у объектов с областью видимости в пределах блока где переиспользуется рабочая или временная память из-за чего переменные имеют мусорное значение(VLA виден после объявления)(может использоваться auto) и выделенная(allocated)(используются функции)

5. Модели или Классы хранения(Storage Class Caveat) и их спецификаторы(несовместимы с typedef и могут быть использованы не более одного раза) в отношении переменных и функций(внешние по умолчанию, статические и встраиваемые в C99): автоматический(automatic), при переопределении внутри блока переменная скрывает(hides) внешнее определение(auto int num;, int auto num; и int num; в блоке идентичны(auto в C++ это не класс хранения)), также регистровый(register), запрос у компилятора поместить переменную в регистр процессора(используется register), у которого нельзя взять адрес, а ещё статический(используется static) с областью видимости в пределах блока(static with block scope) или локальная статическая переменная(local static variable)(не является оператором блока), вдобавок статический с внешним связыванием(static with external linkage) для использования переменной определённой в другом файле, когда повторная инициализация ошибочна, а объявление обязательно(используется extern)(int arr[10]; — определяющее(defining) объявление в main.c и extern int arr[]; — ссылочное(referencing) объявление в additional.c) и статический с внутренним связыванием(static with internal linkage) виден одному файлу(используется static)

6. Блок без фигурных скобок в C99(поддерживают не все компиляторы): выражение внутри операторов(if, while) является подблоком полного оператора, а тело подблоком подблока({if(statement){operators}})

7. Квалификаторы типов(Type Qualifiers) в ANSI C(const - немодифицируемость, volatile - зависимость от внепрограммного воздействия), в C99(restrict - единственное первичное средство доступа к блоку данных(используют некоторые функции стандартной библиотеки)) и в C11(_Atomic в stdatomic.h), все являются идемпотентными(idempotent) в C99: const const int const var; == const int var; == int const var;

8. Новые места для старых ключевых слов(только в контексте формальных параметров) в C99: взаимозаменяемость int * const ptr на int * ptr[const], const char * restrict str на const char * str[restrict], и новое int arr[static 20](arr состоит минимум из 20 элементов)

9. Выделенная память(Allocated Memory): malloc(), calloc()(устанавливает все биты нулём), free() в stdlib.h; динамически-созданный массив(dynamic array) похож на VLA, необязательное в C(в C++ обязательное) приведение возвращаемого типа  void * к другому типу(char * или struct structname *), хранение в куче(memory heap) или свободном хранилище(free storage) и проблема утечки памяти(memory leak)

10. Реализация функций rand() и srand() в stdlib.h, также time() и time_t(обычно приводится к unsigned int) в time.h

11. exit()(и его отличие от  return), EXIT_SUCCESS(эквивалентно 0) и EXIT_FAILURE в stdlib.h

Заметка от себя: на самом деле ссылочное(referencing) объявление переменной с помощью extern это то же, что и обычное объявление(declaration) функции без определения.

> Язык программирования Си 6 издание. Стивен Прата
> C Primer Plus 6th edition. Stephen Prata