Г. Шилдт - Полный справочник по C++ (1109478), страница 8
Текст из файла (страница 8)
Применение модификатора в1дпед допускается, но является излишним, поскольку по умолчанию все целые числа имеют знак. Наиболее важен этот молификатор при уточнении типа оивх в тех реализациях языка С, где тип снах по умолчанию знака не имеет. Разница межлу целыми числами, имеющими и не имеюшими знак, заключается в интерпретации бита в старшем разряде. Если в программе опрелелено целое число со знаком, то компилятор генерирует код, в котором старший бит интерпретируется как признак знака (ййп йа8), Если признак знака равен О, число считается положительным, если он равен ) — отрицательным. Допустим, старшин бит равен 1, значит, зто число станет равным — 1, Олнако, если бы эта переменная была объявлена как ппв1дпеа 1п», ее значение стало бы равным 65535.
Если модификатор типа используется отдельно (т.е. без указания злементарного типа), по умолчанию предполагается, что объявляемая переменная имеет тип ьп». Итак, указанные ниже спецификаторы типов эквивалентны. Саванфиквгор юдпеа ппв1дпеа 1опд БЬОх» вгдпеа ьп» плв1дгеа зп» 1опд в»аг» !и» Хотя одного спецификатора 1п» вполне достаточно, многие программисты прел- почитают явно указывать его модификации. ~ ~ Идентификаторы В языке С/С++ имена переменных, функций. меток и других объектов, определенных пользователем, называются иденаинринатарами (!пс(епт!йегз). Идентификаторы могут состоять из одного или нескольких символов.
Первый сил1вол идентификатора должен быть буквой или символом подчеркивания, а следуюшие символы должны быть буквами, цифрами или символами подчеркивания Ниже прпвелсны примеры правильных и неправильных идентификаторов. Правильно 1сопл» Ь11»веге !ЦдЬ...Ьв1впсе Сепп» »ев»гз Ьгдь Ьа1апсе В языке С длина идентификаторов может быть произвольной. Олнако не все символы, образуюшие идентификатор, считаются значагцими. Если илентнфикатор используется в процессе редактирования внешних связей, то значашими считаются, по крайней мере, шесть его первых символов.
Эти идентификаторы называкзтся анеингими именами (ехтегпа! пагпев). К ним относятся имена функций и глобальных переменных, используемых несколькими файлами. Если идентификатор не используется а процессе редактирования внешних связей, то значашими считаются, по крайней мере, 3! первый символ. Такие идентификаторы называются ануглренними именами (!агента! патпев). К ним относятся, например, имена локальных переменных, В языке С++ нет ограничений на ллину илентификаторов и значашими считаются, по крайней мере, 1024 первых символа. При переходе от языка с к языку С+-1- зтот нюанс следует учитывать.
Символы, набранные в верхнем и нижнем регистре, различаются. Слеловательно, оопп», Сопл» и Сптйгг — зто разные илентификаторы. Часть 1. Основы языка О++: подмножество О Иначе говоря, отрицательные числа представляются с помошью даналнигнельнага кода (пео'в согпр1ептепг), в котором все биты числа (за исключением старшего разряда) инвертированы, затем к полученному числу лобавляется елиница, а признак знака устанавливается равным 1. И»лыс числа со знаком играют весьма важную роль в очень многих алгоритмах, но диапазон их изменения вдвое короче, чем у целых чисел, не имеюших знака.
Рассмотрим двоичное представление числа 327б7 ~О111111111111111 Ключевые слова нельзя использовать в качестве идентификаторов ни в языке С, ни в языке С++. Кроме того, идентификаторы не должны совпадать с именами функций из стандартных библиотек. -~ Переменные //временил (чапаЫе) прелсгавляет собой имя ячейки памяти, которую можно использовать лля хранения модифицируемого значения. Все переменные должны быть объявлены до своего использования. Ниже приведен общий вид объявления переменной. глин список переменных; Злесь слово ныл означает один из допустимых типов данных, включая молификаторы, а слисок нереиенных может состоять из одного или нескольких идентификаторов, разлеленных запятыми.
Рассмотрим несколько примеров объявлений. гпе 1,2,1; в)загс гпс въ; ппвгяпес( гпг па; аоп)з1е Ьа1апсе, ргогзс, 1овв; Учтите, в языке С/С++ имя переменной никак не связано с ее типом. Где обьявля(отся переменные Как правило, переменные объявляют в трех местах: внутри функций, в определении параметров функции и за прелелами всех функций. Соответственна такие переменные называются локальными, формальными параметрами и глобальными. Локальные переменные Г!еременные, объявленные внутри функции, называются локальными ((оса! чапаЫев). В некоторых книгах, посвяшенных языку С/С++, эти переменные называются ивтомин)ическими (аигогпапс чапаЫев).
В нашей книге мы будем придерживаться более обшей терминологии и называть их локальными. Локальные переменные можно использовать только в операторах, расположенных внутри блока, где они объявлены. Иначе говоря, локальные переменные невилимы снаружи их блока. Напомним, что блок о)раничен открываюшей и закрываюшей фигурными скобками. Чаше всего локальные переменные объявляются внутри функций. Рассмотрим два примера. чозс) гппс1(чо!с)) 1пс х; х = 10; чоас( гппс2(чоЫ! ( 1пс х; х = -199т Переменная х объявлена дважды: сначала — в функции в1пс1() „а затем — в функции гипса(). Переменная х из функции гппе1() не имеет никакого отношения Глава 2. Выражения к переменной и, объявленной внутри функции дцпсдО. Каждая из этих переменных сушествует только внутри блока, где она была объявлена.
Язык С содержит ключевое слово ацсо, которое можно использовать лля объявления локальных переменных. Однако„поскольку все локальные переменные по умолчанию считаются автоматическими, это ключевое слово на практике никогда не используется. По этой причине в нашем справочнике мы также не будем его применять. (Говорят, что ключевое слово ацсо было включено в язык С для обеспечения совместимости с его предшественником — языком В.
Затем это слово перекочевало в язык С++ для обеспечения совместимости с языком С.) Из соображений удобства и по традиции большинство программистов объявляют все переменные, используемые в функции, сразу после открываюшей фигурной скобки и перед всеми остальными операторами. Однако следует иметь в виду. что локальные переменные можно объявлять в любом месте блока. Рассмотрим следуюший пример. човб т(чозс)) ( зпс г.; эсапт("%а*с", ьс)г зс(С==1) ( сваг э[80); /* Эта переменная создается только гри входе в данный блок */ ргъпСГ("Введите имя:"); десэ(э); /* Некие операции ...
*/ ) В этом фрагменте локальная переменная а создается при входе в блок вя и разрушается сразу после выхода из него. Кроме того, переменная в является видимой только внутри блока зд, и к ней невозможно обратиться извне, даже из других частеи функции, содержащей данный блок. Объявление переменных внутри блоков позволяет избежать побочных эффектов. Поскольку локальная переменная вне блока не сушествует. ее значение невозможно изменить непреднамеренно. Способы объявления локальных переменных в языке С (в соответствии со стандартом С89) и в языке С++ сушественно отличаются друг от друга.
В языке С все локальные переменные должны быть объявлены в начале блока до выполнения каких- либо ""активных" операторов. Например, попытка объявить локальные переменные так, как показано в приведенном ниже фрагменте, вызовет ошибку. /* Если эта туякция является частью программы яа языке С, прм компиляции возникнет оюибка. если эта 4ункция представляет собой часть программы на языке С++, ошибок не будет. */ ус)) чоЫ ( Епс 10; зпе З; /* Зтат оператор порождает ажибку */ Часть!.
Основы языка С+И подмножество С Между тем, в языке С+ ь зта функция считается абсолютно правильной, поскольку в зтом языке локальные переменные можно объявлять в любом месте блока, но до их первого использования. (Более подробно зта тема будет рассматриваться во второй части книги.) Интересно„что стандарт С99 также позволяет объявлять локальные переменные где угодно. Поскольку локальная переменная создается при входе в блок, где она объявлена, и разрушается при выходе из него, ее значение теряется.
Зто особенно важно учитывать при вызове функции. Локальные переменные функции создаются при ее вызове и уничтожаются при возврате управления в вызывающий модуль. Зто значит, что между двумя вызовалзи функции значения ее локальных переменных не сохраняются. (Заставить их сохранять свои значения можно с помощью модификатора всас1с.) По умолчанию локальные переменные хранятся в стеке. Поскольку стек является динамической структурой, и объем занимаемой им памяти постоянно изменяется, становится понятным, почему локальные переменные в принципе не ьзогут сохранять свои значения межау двумя вызовами функции, внутри которой они объявлены.
Локальную переменную можно проинициализировать неким значением. Оно булет присваиваться переменной каждый раз при входе в блок. Рассмотрим в качестве примера программу, которая десять раз выводит на печать число (О. азпс1цг)е <вег)1о. Ь> чозб й(човс))з 1пе ща1п(ззоьс)) ( 1пс 1ог(1=0з 1<10з з++) В()з геецгп Оз чоЫ й(чоус)) ( ьпс рг1пей("яс) ", З)з /* Втот оператор не имеет долговременного эз)зФекта. */ ) Формальные параметры Если функция имеет аргументы.
следует объявить переменные, которые будут принимать их значения. Зги переменные называются формальными ларгьчезлраии (Гоггла) рагаше(егз). Внутри функции они ничем не отличаются от других локальных переменных. Как показано в приведенном ниже фрагменте программы, объявление таких переменных должно размешаться сразу после имени функции и заключаться в скобки.
/* Функция возвращает 1, если символ с является частью строки вз в противном случае она возвращает 0 */ 1пс 1в зп(сйаг *в, с)заг с) ( к)з11е(*в) Н (*в==с) геецхп 1з е1ве в++з Глава 2. Выражения тетитл Ог г Функция зв 1п() имеет два параметра: в и с. Она возвращает ), если символ с является чзсзью строки в, в противном случае функция возвращает О. Тип формальных параметров задается при их объявлении. После это~о их можно использовать как обычные локальные переменные, Учтите, что, кзк и локальные переменные, формальные параметры являются динамическими и разрушаются прн выхоле из функции.
Формальные параметры можно использовать в любых конструкциях и выражениях. Несмотря на то что свои значения они получаю~ от арггмснгов, перелавземых извне функции, во всем остальном они ничем не отличаются от локальных переменных. Глобальные переменные В отличие от локальных, глобальные леремеяяые (я)оЬа) тзпаЫез) доступны из любой части программы и могут быть использованы где угодно.