Способы передачи информации в функцию и из нее.



Смотри 34.

Область видимости. Понятие блока.

Область видимости (действия) объекта (переменной и др.) – это та часть кода (текста) программы, в которой его можно использовать.

Основное правило видимости в языке Си: объект, объявленный внутри блока (участка программы, заключенного в фигурные скобки), как правило, виден, начиная с места его объявления и заканчивая концом этого блока ( } ). Если объявление данных лежит внутри нескольких входящих друг в друга блоков, оно считается расположенным в самом внутреннем из них. Если же нужно сделать объект видимым за пределами блока, нужно объявить его вне блока. Можно, например, объявить переменные вне всех функций; такие переменные называются глобальными, в отличие от переменных, объявленных внутри функции, называемых локальными и видимых только в пределах своей функции.

Область действия локальных данных – от точки декларации (объявления) до конца функции (блока), в которой произведено их объявление, включая все вложенные в него блоки.

Областью действия глобальных данных считается файл, в котором они определены, от точки описания до его окончания.

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

 

Классы памяти и время жизни

Класс памяти определяет время жизни объекта и место его размещения в памяти

Существует 4 класса памяти: static(статический),extern(внешний), auto(автоматический),register(регистровый).

Объекты класса памяти static, существуют (занимают место в памяти) в течение всего времени работы программы. Их место в памяти определяется на этапе компиляции. К ним по умолчанию относятся глобальные переменные.

Объекты класса памяти auto, существуют лишь во время выполнения блока, в котором объявлены. К ним по умолчанию относятся локальные переменные. Память для них выделяется при входе в блок в пределах определенной области, называемой программным стеком. После выхода из блока занимаемая ими память освобождается и может быть использована для других автоматических переменных.

При любом вызове функции в программном стеке размещаются ее параметры, а также сохраняется содержимое регистров процессора на момент, предшествующий вызову функции, и адрес возврата из функции для того, чтобы при выходе из нее можно было продолжить выполнение вызывающей функции.

Класс памятиextern похож наstatic,но означает, что объект объявлен позже в этом или другом файле (см. ниже). Он может применяться к глобальным переменным.

Класс памяти register похож на auto; но он рекомендует компилятору разместить (если возможно) переменную не в стеке, а непосредственно в регистрах процессора. Регистровая память позволяет увеличить быстродействие программы, но к размещаемым в ней объектам в языке Си (но не С++) не применима операция получения адреса «&».

Обычно класс памяти переменных определяется по умолчанию (static либо auto). Но программист имеет возможность поменять класс памяти объекта, указав требуемый класс при объявлении перед его типом (в пределах допустимого по смыслу - например, глобальная переменная не может быть auto или register).

Препроцессор, его роль. Директивы препроцессора. Директива #include.

Перед компиляцией программа на языке Си обрабатывается специ­альной программой – препроцессором, который работает под управле­нием директив.

Препроцессорные директивы начинаются с символа #, за которым следует наименование директивы, указывающее текущую операцию препроцессора.

Препроцессор решает ряд задач по предварительной обработке программы, основной из которых является «подключение» к программе так называемых заголовочных файлов (обычных текстов) с декларацией стандартных библиотечных функций, которые используются в программе. Наименование такой директивы: include (подключить), а общий формат ее использования: include <имя_файла.h>где «h» – расширение заголовочных файлов.Если имя файла заключено в угловые скобки (< >), то поиск дан­но­го файла производится в стандартной директории (папке) с этими файлами, если же имя файла заключено в двойные кавычки (” ”), то поиск данного файла производится в текущей директории.: Второе основное назначение препроцессора – это обработка макро­­опре­делений. Макроподстановка define (определить) имеет общий вид:#define < ID > <строка>

Например: #define PI 3.1415927

В ходе препроцессорной обработки программы появление в тексте идентификатора PI везде заменяется значением 3.1415927.  

 

39. Операции сдвига (<<, >>)

Операторы сдвига >> и << сдвигают биты в переменной вправо и влево на указанное число. Общий вид оператора сдвига вправо:переменная >> число сдвигова общий вид оператора сдвига влево:переменная << число сдвигов. Сдвиг — это не то же самое, что и вращение, то есть биты, сдвигающиеся на один конец, не появляются с другого. Сдвинутые биты теряются, а с другого конца появляются нули. В том случае, если вправо сдвигается отрицательное число, слева появляются единицы (поддерживается знаковый бит).Операции битового сдвига могут быть полезны при декодировании информации от внешних устройств и для чтения информации о статусе. Операторы битового сдвига могут также использоваться для выполнения быстрого умножения и деления целых чисел. Сдвиг влево равносилен умножению на 2, а сдвиг вправо - делению на 2, как показано в таблице.

 

 

 40. Поразрядные операции (~, &, ^, | )

Поразрядные операции можно применять только к целочисленным операндам, т.е. к операндам типов char, short, int и long, как знаковым так и беззнаковым.

 

& — поразрядное логическое И.
| — поразрядное логическое ИЛИ.
^ — поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ.
~ — поразрядное отрицание, НЕ (унарный оператор).

Оператор & (поразрядное И) часто используется для обнуления некоторой группы разрядов. Например

 n = n & 0177;

обнуляет в n все разряды, кроме младших семи.

Оператор | (поразрядное ИЛИ) применяется для установки отдельных разрядов в 1. Напримерx = x | SET_ON;

устанавливает в результате единицы в тех разрядах, которым соответствуют единицы в SET_ON.

Оператор ^ (поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ) в каждый разряд результата запишет 1, если соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.

Унарный оператор ~ осуществляет поразрядную инверсию своего операнда, преобразуя каждый единичный бит в нулевой и наоборот. Например,x = x & ~077

обнуляет в x последние шесть разрядов. Заметим, что запись x & ~077 не зависит от размера операнда, и, следовательно, она лучше, чем запись x & 0177700, поскольку последняя подразумевает, что x занимает 16 битов. Независимая от типа машины форма записи ~077 не потребует дополнительных затрат времени при работе программы, так как ~077 это константное выражение, вычисляемое во время компиляции.

  


 


Дата добавления: 2018-08-06; просмотров: 416; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!