Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

84 Глава 2

Если же нет, то компилятор выдаст сообщение, но все же вы должны быть осторож- ны. Например, если вы хотите вывести результат сдвига переменной number на 2 бита влево, то должны написать следующий оператор:

Здесь скобки очень важны. Без них операция сдвига интерпретировалась бы ком- пилятором как операция потока, поэтому вы не получили бы должного результата; на вывод было бы отправлено значение number, а за ним 2.

Операция сдвига вправо в основном подобна операции сдвига влево. Например, предположим, что переменная number имеет значение 24, и выполняется следующий оператор:

В результате этого number получит значение 6, разделив исходное значение на 4. Однако сдвиг вправо работает специальным образом со знаковыми целочисленны- ми типами, которые содержат отрицательные значения (то есть, у которых бит зна- ка — крайний левый — равен 1). В этом случае бит знака распространяется вправо. Например, можно объявить и инициализировать переменную number типа char с десятичным значением -104:

Теперь вы можете сдвинуть его вправо на 2 бита с помощью следующего оператора:

Десятичное значение результата будет равно -26, поскольку бит знака повторяет- ся. При операциях с беззнаковыми целочисленными типами, конечно, бит знака не повторяется, поэтому в первой позиции появляется ноль.

Время хранения и область видимости

Все переменные имеют ограниченное время жизни при выполнении программы. Они появляются в точке, где вы их объявили, а затем в некоторой точке они исчеза- ют — не позднее момента завершения программы. Насколько долго существует кон- кретная переменная, определяется свойством, называемым временем хранения (stor- age duration). Существуют три разных вида времени хранения переменных.

Какое из них будет иметь переменная — зависит от того, как вы ее создаете. Пока я отложу дискуссию о динамическом времени хранения до главы 4, но характеристи- ки двух других будут раскрыты в этой главе.

Другое свойство, присущее переменным — это область видимости (scope). Область видимости переменной — это просто часть программы, на протяжении ко- торой имя данной переменной определено. Вне этой области видимости вы не мо- жете ссылаться на ее имя — любая попытка сделать это вызовет ошибку компиляции. Обратите внимание, что переменная все еще может существовать вне этой области видимости, даже несмотря на то, что вы не можете обратиться к ней по имени. Чуть позднее будут даны примеры подобной ситуации.

Все переменные, которые вы до сих пор объявляли в примерах, имели автома- тическое время хранения, а потому назывались автоматическими переменными. Давайте рассмотрим их первыми.

Автоматические переменные

Все переменные, которые вы объявляли до сих пор, объявлялись внутри блока — то есть, внутри пары фигурных скобок. Такие переменные называются автоматиче- скими, и о них говорят, что у них локальная область видимости, или область види- мости блока. Автоматическая переменная "видима", начиная с точки, в которой она объявлена, и до конца блока, содержащего ее объявление. Пространство, которое за- нимает автоматическая переменная, выделяется автоматически в области памяти, на- зываемой стеком, которая специально предназначена для этой цели. По умолчанию размер стека составляет 1 Мбайт, чего достаточно для большинства случаев, хотя если его не хватает, вы можете увеличить размер стека, установив опцию проекта /STACK в необходимое значение по своему выбору.

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

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

Эффект области видимости автоматических переменных демонстрируется на сле- дующем примере.

рассказал об области видимости.