Программирование >>  Процедурные приложения 

1 ... 24 25 26 [ 27 ] 28 29 30 ... 150


переменная ivalue становится доступной до того, как будет инициализирована void function a(void); void function b(void); int main()

ivalue++; сс1лка на объявленную выше переменную cout << ivalue << \n ; выводит значение 11 function a(); return(0);

int ivalue =10; void function a(void) ivalue++; cout << ivalue << \n ; function b () ; инициализация переменной ivalue ссылка на объявленную выше переменную выводит значение 12

------------------------------------------------

Файл В

#include <iostream.h> extern int ivalue ;

void function b (void) f

ivalue++;

cout << ivalue << \n ;

ссылка на переменную ivalue ,

описанную в файле А

выводит значение 13

Объявление переменных на внутреннем уровне

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

Спецификатор register указывает компилятору, что данную переменную необходимо сохранить в регистре процессора, если это возможно. В результате сокращается время доступа к данным и упрощается программный код. Область видимости у регистровых переменных такая же, как и у автоматических. В случае отсутствия свободных регистров переменной присваивается класс auto и она сохраняется в памяти.

Стандарт ANSI С не позволяет запрашивать адрес переменной, сохраненной в регистре. Но это ограничение не распространяется на язык C++. Просто при обнаружении оператора взятия адреса (&), примененного к регистровой переменной, компилятор сохранит переменную в ячейке памяти и возвратит ее адрес.

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

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

#include <iostream.h> int ivalue1 = 1; void function a (void) ; void main ( )

{ ссылка на переменную ivalue1, описанную выше extern int ivalue1; создание статической переменной, видимой только внутри функции main(),

а также инициализация ее нулев1м значением static int ivalue2;



создание регистровой переменной с присвоением ей нулевого значения и сохранением в регистре процессора (если возможно) register int rvalue = 0;

создание автоматической переменной с присвоением ей нулевого

значения intint value3 = 0;

вывод значений 1, 0, 0, 0:

cout << ivalue1 << \n << rvalue << \n

<< ivalue2 << \n << int value3 << \n ; function a () ;

void function a (void) {

сохранение адреса глобальной переменной ivaluel

static int *pivalue1 = &ivalue1;

создание новой, локальной переменной ivalue1;

тем самым глобальная переменная ivalue1 становится недоступной int ivalue1 = 32;

создание новой статической переменной ivalue2,

видимой только внутри функции function a () static int ivalue2 = 2;

ivalue2 += 2;

вывод значений 32, 4 и 1: cout << ivalue1 << \n << ivalue2 << \n << *pivalue1 << \n ;

cout << ivalue1 << \n << ivalue2 << \n << *pivalue1 << \n ;

Поскольку переменная ivalue1 переопределяется внутри функции function a (), доступ к глобальной переменной ivalue1 блокируется. Тем не менее, с помощью указателя pivalue1 можно получить доступ к глобальной переменной, сославшись на нее по адресу.

Правила определения области видимости переменных

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

Объявление функций

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

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

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

Операторы

В языках C/C++ есть ряд операторов, которых вы не встретите в других языках программирования. В их числе побитовые операторы, операторы инкрементирования и декрементирования, условный оператор, оператор запятая, а также операторы комбинированного присваивания.

Побитовые операторы



Побитовые операторы обращаются с переменными как с наборами битов, а не как с числами. Эти операторы используются в тех случаях, когда необходимо получить доступ к отдельным битам данных, например при выводе графических изображений на экран. Побитовые операторы могут выполнять действия только над целочисленными значениями. В отличие от логических операторов, с их помощью сравниваются нe два числа целиком, а отдельные их биты. Существует три основных побитовых оператора: И (&), ИЛИ () и исключающее ИЛИ (). Сюда можно также отнести унарный эператор побитового отрицания (~), который инвертирует значения битов числа.

Побитовое И

Оператор & записывает в бит результата единицу только в том случае, если оба cравниваемых бита равны 1, как показано в следующей таблице:

БитО

1бит1

Результат

Этот оператор часто используют для маскирования отдельных битов числа. Побитовое ИЛИ

Оператор записывает в бит результата единицу в том случае, если хотя бы один лз сравниваемых битов равен 1, как показано в следующей таблице:

Бит 0

1 Бит 1

10 1

0 1

Этот оператор часто используют для установки отдельных битов числа. Побитовое исключающее ИЛИ

Оператор л записывает в бит результата единицу в том случае, если сравниваемые биты отличаются друг от друга, как показано в следующей таблице:

Бит 0 1

БитТ

0 1

0 1

1 1

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

0xF1& 0x35

результат 0x31 (шестнадцатеричное)

0361 & 0065

результат 061 (восьмеричное)

11110011 & 00110101

результат 00110001 (двоичное)

0xF1 0x35

результат 0xF5 (шестнадцатеричное)

0361 0065

результат 0365 (восьмеричное)



1 ... 24 25 26 [ 27 ] 28 29 30 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика