- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
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, которое вы можете применять для специфика- ции автоматических переменных, но оно редко используется, поскольку предполага- ется по умолчанию. Ниже приведен пример, иллюстрирующий то, что я до сих пор
Эффект
области видимости автоматических
переменных демонстрируется на сле-
дующем
примере.