Г. Шилдт - Полный справочник по C++ (1109478), страница 14
Текст из файла (страница 14)
Сам указатель представляет собой переменную, в которой хранится адрес объекта базового типа. Таким образом, указатель на символьную переменную (как и любои другой указатель) должен иметь достаточный размер, чтобы хранить любой алрес в соответствии с архитектурои компьютера. Однако, как правило, указатели ссылаются только на объекты своею базового типа. В одном объявлении можно смешивать и указатели, и обычные переменные. Например, оператор $ Епс х, у, соцпсг объявляет пелочисленные переменные н и соиас вместе с указателем у, ссылающимся на целочисленные переменные.
В следующей программе операторы * и а используются лля записи значения 10 в переменную еахяве. В результате на экран выводится число 1О. Вьпс1ис)е <ясно.)г> Гпх ааьп(чоЫ) Епс сахвес, аоцхсе; Епс *аи воохсе = 10) и = авоихсег сахоес = *гсг рхвпсЕ("Ъс)", сатдес); хесихп 0; ) Статический оператор амеб Статический унарный оператор вЕаеоЕ вычисляет длину операнда в бантах. Операндом может быть как отдельная переменная, так и имя типа, заключенное в скобки. Предположим, что размер типа епе равен 4 байт, а типа гтоо)з1е — 8 байт. В этом случае следующий фрагмент програмл)ы выведет на экран числа В 4. г г оси)з1е Ег рхвпсб("Ъст ", аваеоЕ Е); рхъисг("во ", эваеог(ъпх))г Следует помнить, что для вычисления размера типа его имя должно быть заключено в скобки.
Имя переменной в скобки заключать не обязательно, хотя и вреда от этого не будет. С помощью оператора переопределения типа суреаее в языке С/С++ выделен специальный тип ваке е, отдаленно напоминающий целое число без знака. С формальной точки зрения результат оператора взявоЕ имеет тип ваке с, но на практике его можно считать целым числом без знака. Оператор вЕяеоЕ позволяет создавать мащинонезависимые программы, в которых автоматически учитываются размеры встроенных типов.
В качестве примера рассмотрим базу данных, кюкаая запись которой состоит из шести целых чисел. Если такую базу необходимо реализовать на разных компьютерах, нельзя надеяться, что размер целочис- лепного типа всзлс булат одинаков. Фактичсскую дли) )у типа следует определить с )кжю- шью оператора айаеой. Таким образом, пропжмма должна имсз.ь примсрно такои вил. /" 3 гюль б целых чисел в Файл. */ чсйй рцс сес(йлй тес(б], утьд *йр) ( 1пс 1еп; 1ел = йит1Се(тес, вйзеой(йлй)*б, 1, йр); йй(1ел )=.
1) рлзпйй("Ожибка лри залили"); Функция рис тес() правильно компилирустся и выполняется в любой срсдс, в том числе на ! 6- и 32-разрядных компьютсрах. В заключение отметим, что опсратор вйаеой выполнястся ца этапс компиляции, и сто результат в программе рассматривается как константа. Оператор последовательного вычисления Оператор послсдоватсльного вычислсния (орега)ог сопцла) связывает в одно цслос несколько выражсций. Символом этого оператора являстся запя гав.
Подразумсвается, что левая часть оператора послсдоватсльного вычисления всегда имеет тип згейа. Это означает, что значснис выражения, стоящего в его правои части, становится зпачснисм всего выражения, разделенного запятыми. Например, оператор В к = (у=з, уъ1); сначала присваиваст псремснной у значение 3, а затсм присваиваст псрсмснной х значсцис 4. Скобки здссь необходимы, поскольку приоритет опсраторв послсдовательного вычислсния меньше, чсм приоритет оператора присваивания.
По сушсству, выполнение оператора послсдоватсльного вычислсния сводится к выполнению нескольких операторов подряд. Если этот оператор стоит в правой части опсратора присваивания, то его результатом всегда будет результат выражения, стояшсго послсдним в списке. Опсратор последовательного вычисления можно сравнить с союзом "и" в выражении "сделай это и это и это". Оператор доступа к члену структуры и ссылки на член структуры В языке С символы "." и "->" обозначают операторы доступа к элемснтам структур и объсдинсний.
Сглрукглуры и обаедолелил являются составными типами данных (иногда их сщс называют агрегированными), в которых одно имя связываст насколько объектов. (см. главу 7). Оператор доступа к члену структуры (точка) используется для нспосрсдствснного обращения к элементу структуры или объсдинсния. Оператор ссылки на член структуры используется лля обращения к члсну структуры или объсдинения через указатель. Рассмотрим Фрагмент программы. аттцсй еслр1оуес снег лате(80!; йлс ас)ег й1оаг ваде; Етрс алгцсй елр1оуее 'р = аеслр; /* Записать адрес: структуры епр а указатель р */ Часть 1. Основы языка С++; подмножвагво С Для того чтобы присвоить члену иоде структуры епр значение )23.33„нужно выполнить следуюший оператор В е~пр сиада = 123.23( То же самое можно сделать, использовав указатель на структуру еир.
$ р->иоде = 133.33; Операторы "Ц" и "и" Круглые скобки — это оператор, повышаюший приоритет операций, заключенных внутри. Квалрап(ыс скобки используются лля индексации массива (массивы подробно обсуждаются в главе 4). Если в программе определен массив, то значение выражения, заключенного в квадратные скобки, равно индексу элемента массива. Рассмотрим лемонстрационную программу.
Мвпс1пйе <ве<)во.'и> снап в(90)( впс та(п(чоЫ) ( а(3) = 'х'у рс1псй("Ъс", в(3)); сеспсп О; ) Здесь символ 'к' сначала присваивается четвертому элементу массива (в языке С элементы всех массивов нумеруются, начиная с нуля), а затем выводится на экран. Приоритеты операторов Приоритеты всех операторов указаны в табл. 2,8. Обратите внимание на то, что все операторы, за исключением унарных и тернарного, выполняются слева направо.
Унарные операторы "*", "в" и "-" выполняются справа налево. таблица 2.В. Приоритеты операторов в языке С () и -> Высший ! - ++ — +- [«ш) * а евиеоя «» « » ( )) аз Высший + — = / и е.д. Низший Глава 2. Выражения Щффд)(ОБАД 6 языке С++ определены еи(е несколько дополнительных алератарав, катарые ))чд(вид)яяяН ~ЩЩЩ)Щ((Щ будут рвссмаспрены в части П. ~ 1 Выражения Выражения состоят из операторов, констант, функций и переменных.
В языке С/Сч ь выражением считается любая допустимая комбинация этих элементов. Поскольку большинство выражений в языке С/Сч ь напоминают алгебраические, часто их таковыми и считают. Однако при этол~ следует учитывать специфические особенности языков С и С++. Порядок вычислений Ни в языке С, ни в языке С++ порядок вычисления полвыражений, входящих в выражения, не определен. Компилятор может сам перестраивать выражения, стремясь к созданию оптимального объектного кола. Зто означает, что программист не должен полагаться на определенный порядок вычисления полвыражений. Скажем, при вычислении выражения $х = 11О + х2(); нет никаких гарантий, что функция е1() будет вызвана раньше функции лл(). Преобразование типов в выражениях Если в выражение входят константы и переменные разных типов, они преобразуются к одному типу. Компилятор преобразует все операнлы в тип "наибольшего" операнда.
Зтот процесс называется расширением тилак ((уре ргопюйоп). Во-первых, все переменные типов снят и еноте 1пе автоматически преобразу1стся в тип 1пс. Этот процесс называется иелачисленным расширением ((п(еяга! ргогпойоп). Во-вторых, все преобразования выполняются одно за другим, слелуя приведенному ниже алгоритму. ЕСЛИ операнд имеет тин 1опд доиЬ1е, ТО второй операнд преобразуется в тнп 1опд донЬ1в ИНАЧЕ, ЕСЛИ операнд имеет тип донЬ1е, ТО второй операнд преобразуется в тип долхЬ1в ИНАЧЕ, ЕСЛИ операнд имеет тнп х1овс, ТО второй операнд преобразуется в тип Л1овс ИНАЧЕ, ЕСЛИ операнд имеет тип нпв1дпвд 1опд, ТО второй операнд преобразуется в тип ппв1дпвд 1опд ИНРЛЕ, ЕСЛИ операнд имеет тип 1опд, ТО второй операнд преобразуется в тип 1опд Инлчл, ЕСЛН операнд имеет тип ппв1опвд лпе, ТО второй операнд преобразуется в тип ппв1дпед лпе Кроме того, есть одно правило: если один из операторов имеет тип 1опд, а второй — нпв1дпед Епс, н значение переменной типа нпв1дпвд 1пс невозможно прел- ставить с помощью типа 1опд, то оба операнда преобразуются в тип ппв1дпвд 1опд.
После выполнения преобразований тип обоих операнлов одинаков и совпалает с типом резуль~ата выраженил. Рассмотрим пример преобразования типов. Прелполагается, что переменная хевизе описана в другом месте программы. — Прим. рвд. Часть !. Основы языка С++: подмножество С б+ 1 ) донЬ1е йоп)з1е Здесь символ с)з сначала преобразуется в целое число.
Затем результат операции о)з/1 преобразуется в тип доо)з1е, поскольку именно этот тип имеет результат выражсиня аьи. ПОСЛЕ ЭТОГО рЕЗуЛЬтат ОПЕрацИИ а+а ПрЕОбраЗуЕтСя В тнл ПЕрЕМЕННОй й, т.е. в тип Я1оас. Окончательный результат имеет тип дочхз1е, Приведение типов Используя приведение типов (саз(), можно принудительно задать тип выражения. Привеление типов имеет следуюший вид. (тии) выражение Здесь тип — это любой допустимый тип ланных. Например, в приведенном ниже фрагменте программы результат вырюкения х/2 приводится к типу а1оас.
$ (т1оас) к/2 С формальной точки зрения приведение типов является унарным оператором, и его приоритет совпадает с приоритетами всех других унарных операторов. Несмотря на то что приведение типов не слишком широко попользуется в программировании, иногда этот оператор оказывается очень полезным. Предположим, что нам необходимо использовать целочисленную переменную в качестве счетчика цикла, а в вычислениях необходимо учитывать дробные части. В этом случае приведение типов позволит нам сохранить точность вычислений. Вупс1пде <вед1о.)з> 1пс иа1п(чоЫ) /* выводит на печать число 1 и 1/2 с учетом дробной части */ ( апс 1; Хот(1=1з 1к=100з ++1) ртйпсй('Ьд / 2 =: ьгруп", 1, (б1оас) 1 /2)г тесшп Оз Без оператора привеления типа (тьоас) деление было бы целочисленным и дробная часть была бы потеряна.
й языке С++ првдусмогпрвны ви(в несколько опврвгпоров приведения типов. в чвипности поппе авве и вевеза авве. Они обсуждаются в часто //. Глава 2. Выражения с)зат сун з.пс з.; Г1оас д; донЬ1е д; гевн1с= ( с)з / 1 ) 1 1 апг 1 1 ! 1пс + ( Г*д) — ( 1 1 дон)з1е 1 1 1 1 д1оас 1 1 1 Г1оас 1 1 1 Пробелы и круглые скобки Пробелы и символы табуляции облегчают чтение нрограмм. Например, два следу1ощих оператора совершенно одинаковы х=10/у-(127Гх): х = 10 Г у -П27Гх); Лишние скобки не ~риводят к ошибкам и не замела(иот выиолнение программ. Однако оци позволяют прояснить точный порядок вычислений.
Как вы полагаете, какой из операторов легче понять? х .= уГЗ-За*гетр+127; х = (уГЗ) — (34*сетпр] + 127; Составные операторы присваивания В языке С/С++ существуют составные формы оператора присваивания, представляющие собой комбинации оператора присваивания и арифметических оиераторов. Например, оператор й х = хз10; можно переписать в анас Фх += 10; Оператор "+=" сообщает компилятору, что к старому значени(о переменной х следует прибавить число ! О. Оператор присваивания образует составные формы практически со всеми бинарными операторами. Итак, выражение вида переменная =- переменная оператор выражение можно переписать следующим образом: переменная оператор= выражение Например, выражение 6 х = х-100; можно переписать как $ х -= 100; Составные формы присваивания широко используются в профессиональных программах на языке С/С++.