Современная электронная библиотека ModernLib.Net

C++

ModernLib.Net / Программирование / Хилл Мюррей / C++ - Чтение (стр. 16)
Автор: Хилл Мюррей
Жанр: Программирование

 

 


      Можно было бы ожидать, что раз ввод/вывод «stream.h» определен с помощью общедоступных средств языка, он будет мнее эффективен, чем встроенное средство. На самом деле это не так. Для действий вроде «поместить символ в поток» использются inline-функции, единственные необходимые на этом уровне вызовы функций возникают из-за переполнения сверху и снизу.
      Для простых объектов (целое, строка и т.п.) требуется по оному вызову на каждый. Как выясняется, это не отличается от прочих средств ввода/вывода, работающих с объектами на этом уровне.

8.8 Упражнения

      1. (*1.5) Считайте файл чисел с плавающей точкой, составьте из пар считанных чисел комплексные числа и выведите комплексные числа.
      2. (*1.5) Определите тип name_and_address (имя_и_адрес). Определите для него «„ и “». Скопируйте поток объектов name_and_address.
      3. (*2) Постройте несколько функций для запроса и чтения различного вида информации. Простейший пример – функция y_or_n() в #8.4.4. Идеи: целое, число с плавающей токой, имя файла, почтовый адрес, дата, личные данные и т. д. Постарайтесь сделать их защищенными от дурака.
      4. (*1.5) Напишите программу, которая печатает (1) все бувы в нижнем регистре, (2) все буквы, (3) все буквы и цифры, (4) все символы, которые могут встречаться в идентификаторах С++ на вашей системе, (5) все символы пунктуации, (6) целые значения всех управляющих симвлов, (7) все символы пропуска, (8) целые значения всех символов пропуска, и (9) все печатаемые символы.
      5. (*4) Реализуйте стандартную библиотеку ввода/вывода C («stdio.h») с помощью стандартной библиотеки ввода/вывда С++ («stream.h»).
      6. (*4) Реализуйте стандартную библиотеку ввода/вывода С++ («stream.h») с помощью стандартной библиотеки ввода/ввода C («stdio.h»).
      7. (*4) Реализуйте стандартные библиотеки C и С++ так, чтбы они могли использоваться одновременно.
      8. (*2) Реализуйте класс, для которого [] перегружено для реализации случайного чтения символов из файла.
      9. (*3) Как Упражнение 8, только сделайте, чтобы [] работло и для чтения, и для записи. Подсказка: сделайте, чтбы [] возвращало объект «дескрипторного типа», для котрого присваивание означало бы присвоить файлу через дескриптор, а неявное преобразование в char означало бы чтение из файла через дескриптор.
      10. (*2) Как Упражнение 9, только разрешите [] индексировать записи некоторого вида, а не символы.
      11. (*3) Сделайте обобщенный вариант класса, определенного в Упражнении 10.
      12. (*3.5) Разработайте и реализуйте операцию ввода по споставлению с образцом. Для спецификации образца исползуйте строки формата в духе printf. Должна быть возмоность попробовать сопоставить со вводом несколько образцов для нахождения фактического формата. Можно было бы вывести класс ввода по образцу из istream.
      13. (*4) Придумайте (и реализуйте) вид образцов, которые намного лучше.

Справочное Руководство
 
1. Введение

      Язык программирования С++ – это C*, расширенный введенем классов, inline-функций, перегруженных операций, перегрженных имен функций, константных типов, ссылок, операций уравления свободной памятью, проверки параметров функций. Коротко различия между С++ и «старым С» приведены в #15. В этом руководстве описывается язык на Июнь 1985.
      – * «Язык программирования Си» Брайэна В. Кернигана и Дениса М. Ритчи. Это руководство было построено на основе Спрвочного Руководства по Языку C («C Programming Language – Reference Manual») системы UNIX V с разрешения AT amp;T Bell Laboratories. (прим. автора)

2. Договоренности о Лексике

      Есть шесть классов лексем: идентификаторы, ключевые слва, константы, строки, операторы и прочие разделители. Симвлы пробела, табуляции и новой строки, а также комментарии (собирательно – «белые места»), как описано ниже, игнорируюся, за исключением тех случаев, когда они служат разделителми лексем. Некое пустое место необходимо для разделения идетификаторов, ключевых слов и констант, которые в противном случае окажутся соприкасающимися.
      Если входной поток разобран на лексемы до данного симвла, принимается, что следующая лексема содержит наиболее длинную строку символов из тех, что могут составить лексему.

2.1 Комментарии

      Символы /* задают начало комментария, заканчивающегося символами */. Комментарии не могут быть вложенными. Символы / / начинают комментарий, который заканчивается в конце строки, на которой они появились.

2.2 Идентификаторы (Имена)

      Идентификатор – последовательность букв и цифр проивольной длины. Первый символ обязан быть буквой. Подчерк '_' считается за букву. Буквы в верхнем и нижнем регистрах явлются различными.

2.3 Ключевые Слова

      Следующие идентификаторы зарезервированы для использовния в качестве ключевых слов и не могут использоваться иным образом:
      asm auto break case char class const continue default delete do double else enum extern float for friend goto if inline int long new operator overload public register return short sizeof static struct switch this typedef union unsigned virtual void while
      Идентификаторы signed и volatile зарезервированы для применения в будущем.

2.4 Константы

      Как описано ниже, есть несколько видов констант. В #2.6 приводится краткая сводка аппаратных характеристик, которые влияют на их размеры.

2.4.1 Целые Константы

      Целая константа, состоящая из последовательности цифр, считается восьмиричной, если она начинается с 0 (цифры ноль), и десятичной в противном случае. Цифры 8 и 9 не являются восьмиричными цифрами. Последовательность цифр, которой прешествует 0х или 0Х, воспринимается как шестнадцатиричное цлое. В шестнадцатеричные цифры входят буквы от а или А до f или F, имеющие значения от 10 до 15. Десятичная константа, значение которой превышает наибольшее машинное целое со знком, считается длинной (long); восьмеричная и шестнадцатериная константа, значение которой превышает наибольшее машинное целое со знаком, считается long; в остальных случаях целые константы считаются int.

2.4.2 Явно Заданные Длинные Константы

      Десятичная, восьмиричная или шестнадцатиричная констата, за которой непосредственно стоит l (латинская буква «эль») или L, считается длинной константой.

2.4.3 Символьные Константы

      Символьная константа состоит из символа, заключенного в одиночные кавычки (апострофы), как, например, 'х'. Значением символьной константы является численное значение символа в машинном наборе символов (алфавите). Символьные константы считаются данными типа int.
      Некоторые неграфические символы, одиночная кавычка ' и обратная косая \, могут быть представлены в соответствие со следующей таблицей escape-последовательностей:
      символ новой строки NL(LF) \n горизонтальная табуляция NT \t вертикальная табуляция VT \v возврат на шаг BS \b возврат каретки CR \r перевод формата FF \f обратная косая \ \\ одиночная кавычка (апостроф) ' \' набор битов 0ddd \ddd набор битов 0xddd \xddd
      Escape-последовательность \ddd состоит из обратной ксой, за которой следуют 1, 2 или 3 восьмеричных цифры, задащие значение требуемого символа. Специальным случаем такой консрукции является \0 (не следует ни одной цифры), задающая пустой символ NULL. Escape-последовательность \xddd состоит из обратной косой, за которой следуют 1, 2 или 3 шестнадцатричных цифры, задающие значение требуемого символа. Если слдующий за обратной косой символ не является одним из перечиленных, то обратная косая игнорируется.

2.4.4 Константы с Плавающей Точкой

      Константа с плавающей точкой состоит из целой части, десятичной точки, мантиссы, е или Е и целого показателя стпени (возможно, но не обязательно, со знаком). Целая часть и мантисса обе состоят из последовательности цифр. Целая часть или мантисса (но не обе сразу) может быть опущена; или десятичная точка, или е(Е) вместе с целым показателем степени (но не обе части одновременно) может быть опущена. Константа с плавающей точкой имеет тип double.

2.4.5 Перечислимые Константы

      Имена, описанные как перечислители, (см. #8.5) являются константами типа int.

2.4.6 Описанные Константы

      Объект (#5) любого типа может быть определен как имеющий постоянное значение во всей области видимости (#4.1) его имни. В случае указателей для достижения этого используется декларатор *const; для объектов, не являющихся указателями, используется описатель const (#8.2).

2.5 Строки

      Строка есть последовательность символов, заключенная в двойные кавычки: «...». Строка имеет тип «массив символов» и класс памяти static (см. #4 ниже), она инициализируется зданными символами. Все строки, даже если они записаны одинково, различны. Компилятор располагает в конце каждой строки нулевой (пустой) байт \0 с тем, чтобы сканируюшая строку программа могла найти ее конец. В строке перед символом двоной кавычки " обяэательно должен стоять \; кроме того, могут использоваться те же escape-последовательности, что были опсаны для символьных констант. И, наконец, символ новой строки может появляться только сразу после \, тогда оба,– \ и символ новой строки,– игнорируются.

2.6 Харктеристики Аппаратного Обеспечения

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

3. Запись Синтаксиса

      По используемым в данном руководстве синтаксическим првилам записи синтаксические категории выделяются курсивом а литеральные слова и символы шрифтом постоянной ширины. Алтернативные категории записываются на разных строках. Необзательный терминальный или нетерминальный символ обозначается нижним индексом «opt», так что
 
      (* выражение opt *)
      указывает на необязательность выражения в фигурных скоках. Синтаксис кратко изложен в #14.

4. Имена и Типы

      Имя обозначает(денотирует) объект, функцию, тип, значние или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определящий его использование. Объект – это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл знчения, обнаруженного в объекте, определяется типом имени, ипользованного для доступа к нему.

4.1 Область Видимости

      Есть четыре вида областей видимости: локальная, файл, программа и класс.
      Локальная: Имя, описанное в блоке (#9.2), локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Исключение составляют метки (#9.12), которые могут использоваться в любом месте функции, в которой они описаны. Имена формальных параметров функции рассматриваются так, как если бы они были описаны в самом внешнем блоке этой функции.
      Файл: Имя, описанное вне любого блока (#9.2) или класса (#8.5), может использоваться в файле, где оно описано, после места описания.
      Класс: Имя члена класса локально для его класса и может использоваться только в функции члене этого класса (#8.5.2), после примененной к объекту его класса (#7.1) операции . или после примененной к указателю на объект его класса (#7.1) операции -». На статические члены класса (#8.5.1) и функции члены можно также ссылаться с помощью операции :: там, где имя их класса находится в области видимости. Класс, описанный внутри класса (#8.5.15), не считается членом, и его имя прнадлежит охватывающей области видимости.
      Имя может быть скрыто посредством явного описания того же имени в блоке или классе. Имя в блоке или классе может быть скрыто только именем, описанным в охватываемом блоке или классе. Скрытое нелокальное имя также может использоваться, когда его область видимости указана операцией :: (#7.1). Имя класса, скрытое именем, которое не является именем типа, все равно может использоваться, если перед ним стоит class, struct или union (#8.2). Имя перечисления enum, скрытое имнем, которое не является именем типа, все равно может исползоваться, если перед ним стоит enum (#8.2).

4.2 Определения

      Описание (#8) является определением, за исключением тех случаев, когда оно описывает функци, не задавая тела функции (#10), когда оно содержит спецификатор extern (1) и в нем нет инициализатора или тела функции, или когда оно является опсанием класса (#8.8).

4.3 Компоновка

      Имя в файловой области видимости, не описанное явно как static, является общим для каждого файла многофайловой прораммы. Таковым же является имя функции. О таких именах говорится, что они внешние. Каждое описание внешнего имени в программе относится к тому же объекту (#5), функции (#8.7), классу (#8.5), перечислению (#8.10) или значению перечислитля (#8.10).
      Типы, специфицированные во всех описаниях внешнего имени должны быть идентичны. Может быть больше одного определения типа, перечисления, inline-функции (#8.1) или несоставного const (#8.2), при условии, что определения идентичны, поялются в разных файлах и все инициализаторы являются констанными выражениями (#12). Во всех остальных случаях должно быть ровно одно определение для внешнего имени в программе.
      Реализация может потребовать, чтобы составное const, ипользованное там, где не всречено никакого определения const, должно быть явно описано extern и иметь в программе ровно оно определение. Это же ограничение может налагаться на inline -функции.

4.4 Классы Памяти

      Есть два описываемых класса памяти: автоматический и статический.
      Автоматические объекты локальны для каждого вызова блока и сбрасываются по выходе из него.
      Статические объекты существуют и сохраняют свое значение в течение выполнения всей програмы.
      Некоторые объекты не связаны с именами и их времена жини явно управляются операторами new и delete, см. #7.2 и #9.14

4.5 Основные Типы

      Объекты, описанные как символы (char), достаточны для хранения любого элемента машинного набора символов, и если принадлежащий этому набору символ хранится в символьной перменной, то ее значение равно целому коду этого символа.
      В настоящий момент имеются целые трех размеров, описывемые как short int, int и long int. Более длинные целые (long int) предоставляют не меньше памяти, чем более короткие целые (short int), но при реализации или длинные, или короткие, или и те и другие могут стать эквивалентными обычным целым. «Обычные» целые имеют естественный размер, задаваемый архтектурой центральной мащины; остальные размеры делаются такми, чтобы они отвечали специальным потребностям.
      Каждое перечисление (#8.9) является набором именованных констант. Свойства enum идентичны свойствам int.
      Целые без знака, описываемые как unsigned, подчиняются правилам арифметики по модулю 2n, где n – число бит в их представлении.
      Числа с плавающей точкой одинарной (float) и двойной (double) точности в некоторых машинных реализациях могут быть синонимами.
      Поскольку объекты перечисленных выше типов вполне можно интерпретировать как числа, мы будем говорить о них как об арифметических типах. Типы char, int всех размеров и enum бдут собирательно называться целочисленными типами. Типы float и double будут собирательно называться плавающими типами.
      Тип данных void (пустой) определяет пустое множество значений. Значение (несуществующее) объекта void нельзя ипользовать никаким образом, не могут применяться ни явное, ни неявное преобразования. Поскольку пустое выражение обозначает несуществующее значение, такое выражение такое выражение мжет использоваться только как оператор выражение (#9.1) или как левый операнд в выражении с запятой (#7.15). Выражение может явно преобразовываться к типу void (#7.2).

4.4 Производные Типы

      Кроме основных арифметических типов концептуально сществует бесконечно много производных типов, сконструированых из основных типов следующим образом:
      массивы объектов данного типа;
      функции, получающие аргументы данного типа и возвращащие объекты данного типа;
      указатели на объекты данного типа;
      ссылки на объекты данного типа;
      константы, являющиеся значениями данного типа;
      классы, содержащие последовательность объектов различных типов, множество функций для работы с этими объектами и набор ограничений на доступ к этим объектам и функциям; структуры, являющиеся классами без ограничений доступа;
      объединения, являющиеся структурами, которые могут в разное время содержать объекты разных типов.
      В целом эти способы конструирования объектов могут прменяться рекурсивно.
      Объект типа void* (указатель на void) можно использовать для указания на объекты неизвестного типа.
      5. Объекты и Lvalue (Адреса)
      Объект есть область памяти. lvalue (адрес) есть выражние, ссылающееся на объект. Очевидный пример адресного выржения – имя объекта. Есть операции, дающие адресные выражния: например, если Е – выражение типа указатель, то *Е – адресное выражение, ссылающееся на объект, на который указвает Е. Термин «lvalue» происходит из выражения присваивания Е1=Е2, в котором левый операнд Е1 должен быть адресным (value) выражением. Ниже при обсуждении каждого оператора указывается, требует ли он адресные операнды и возвращает ли он адресное значение.
      6. Преобразования
      Определенные операции могут в зависимости от их операдов вызывать преобразование значения операнда от одного типа к другому. В этой части объясняется, каков ожидаемый резултат таких преобразований. В #6.6 содержится краткое описание преобразований, требуемых наиболее стандартными операциями; оно будет дополняться по мере надобности в процессе обсуждния каждой операции. В #8.5.6 описываются преобразования, оределяемые пользователем.

6.1 Символы и Целые

      Символ или короткое целое могут использоваться, если может использоваться целое. Во всех случаях значение преобразуется к целому. Преобразование короткого целого к длинному всегда включает в себя знаковое расширение; целые являются величинами со знаком. Содержат символы знаковый раряд или нет, является машинно зависимым, см. #2.6. Более яный тип unsigned char ограничивает изменение значения от 0 до машинно зависимого максимума.
      В машинах, где символы рассматриваются как имеющие знак (знаковые), символы множества кода ASCII являются положителными. Однако, символьная константа, заданная восьмеричной escпоследовательностью подвергается знаковому расширению и может стать отрицательным числом; так например, '\377' имеет значение -1.
      Когда длинное целое преобразуется в короткое или в char, оно урезается влево; избыточные биты просто теряются.

6.2 Float и Double

      Для выражений float могут выполняться действия арифметки с плавающей точкой одинарной точности. Преобразования меду числами одинарной и двойной точности выполняются настолько математически корректно, насколько позволяет аппаратура.

6.3 Плавающие и Целые

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

6.4 Указатели и Целые

      Выражение целого типа можно прибавить к указателю или вычесть из него. В таком случае первый преобразуется, как указывается при обсуждении операции сложения.
      Можно производить вычитание над двумя указателями на объекты одного типа; в этом случае результат преобразуется к типу int или long в зависимости от машины, см. #7.4.

6.5 Unsigned

      Всегда при сочетании целого без знака и обычного целого обычное целое преобразуется к типу unsigned и результат имеет тип unsigned. Значением является наименьшее целое без знака, равное целому со знаком (mod 2**(размер слова)) (т.е. по мдулю 2**(размер слова)). В дополнительном двоичном предсталении это преобразование является пустым, и никаких реальных изменений в двоичном представлении не происходит.
      При преобразовании целого без знака в длинное значение результата численно совпадает со значением целого без знака. Таким образом, преобразование сводится к дополнению нулями слева.

6.6 Арифметические Преобразования

      Большое количество операций вызывают преобразования и дают тип результата одинаковым образом. Этот стереотип будет называться «обычным арифметическим преобразованием».
      Во-первых, любые операнды типа char, unsigned char или short преобразуются к типу int.
      Далее, если один из операндов имеет тип double, то дргой преобразуется к типу double и тот же тип имеет рзультат.
      Иначе, если один из операндов имеет тип unsigned long, то другой преобразуется к типу unsigned long и таков же тип результата.
      Иначе, если один из операндов имеет тип long, то другой преобразуется к типу long и таков же тип результата.
      Иначе, если один из операндов имеет тип unsigned, то другой преобразуется к типу unsigned и таков же тип рзультата.
      Иначе оба операнда должны иметь тип int и таков же тип результата.

6.7 Преобразования Указателей

      Везде, где указатели присваиваются, инициализируются, сравниваются и т.д. могут выполняться следующие преобразовния.
      Константа 0 может преобразовываться в указатель, и грантируется, что это значение породит указатель, отлиный от указателя на любой объект.
      Указатель любого типа может преобразовываться в void*.
      Указатель на класс может преобразовываться в указатель на открытый базовый класс этого класса, см. #8.5.3.
      Имя вектора может преобразовываться в указатель на его первый элемент.
      Идентификатор, описанный как «функция, возвращающая ...», всегда, когда он не используется в позиции имени функции в вызове, преобразуется в «указатель на функцию, возвращающую ...».

6.8 Преобразования Ссылок

      Везде, где инициализируются ссылки, может выполняться следующее преобразование.
      Ссылка на класс может преобразовываться в ссылку на отрытый базовый класс этого класса, см. #8.6.3.

7. Выражения

      Приоритет операций в выраженях такой же, как и порядок главных подразделов в этом разделе, наибольший приоритет у первого. Так например, выражения, о которых говорится как об операндах операции + (#7.4) – это те выражения, которые опрделены в ##7.1-7.4. Внутри каждого подраздела операции имеют одинаковый приоритет. В каждом подразделе для рассматриваемых в нем операций определяется их левая или правая ассоциатиность (порядок обработки операндов). Приоритет и ассоциатиность всех операций собран вместе в описании грамматики в #14.
      В остальных случаях порядок вычисления выражения неопрделен. Точнее, компилятор волен вычислять подвыражения в том
      порядке, который он считает более эффективным, даже если повыражения вызывают побочные эффекты. Порядок возникновения побочных эффектов неопределен. Выражения, включающие в себя коммутативные и асссоциативные операции (*, +, amp;, !, ^), мгут быть реорганизованы произвольным образом, даже при налчии скобок; для задания определенного порядка вычисления вражения необходимо использовать явную временную переменную.
      Обработка переполнения и контроль деления при вычислении выражения машинно зависимы. В большинстве существующих реалзаций С++ переполнение целого игнорируется; обработка деления на 0 и всех исключительных ситуаций с числами с плавающей точкой различаются от машины к машине и обычно могут регулроваться библиотечными функциями.
      Кроме стандартного значения, описанного в #7.2-7.15, операции могут быть перегружены*, то есть, могут быть заданы их значения для случая их применения к типам, определяемым пользователем, см. #7.16.
      – * Этот термин применяется для описания использования в языке одной и той же лексемы для обозначения различных процдур; вид процедуры выбирается компилятором на основании дполнительной информации в виде числа и типа аргументов и т.п. (прим.перев.)

7.1 Основные Выражения

      Основные выражения, включающие в себя . , -» , индексрование и вызовы функций, группируются слева направо.
      список_выражений: выражение список_выражений , выражение
      id: идентификатор имя_функции_операции typedef-имя :: идентификатор typedef-имя :: имя_функции_операции
      первичное_выражение: id :: идентификатор константа строка this ( выражение ) первичное_выражение [ выражение ] первичное_выражение ( список_выражений opt ) первичное_выражение . id первичное_выражение -» id
      Идентификатор есть первичное выражение, причем соответтвенно описанное (#8). Имя_функции_операции есть идентификтор со специальным значением, см. #7.16 и #8.5.1.
      Операция ::, за которой следует идентификатор из файловой области видимости, есть то же, что и идентификатор. Это позволяет ссылаться на объект даже в том случае, когда его идентификатор скрыт (#4.1).
      Typedef-имя (#8.8) , за которым следует ::, после чего следует идентификатор, является первичным выражением. Typedef -имя должно обозначать класс (#8.5), и идентификатор должен обозначать член этого класса. Его тип специфицируется описанием идентификатора. Typedef-имя может быть скрыто именем, которое не является именем типа. В этом случае typedef-имя все равно может быть найдено и его можно использовать.
      Константа является первичным выражением. Ее тип должен быть int, long или double в зависимости от ее формы.
      Строка является первичным выражением. Ее тип – «массив символов». Обычно он сразу же преобразуется в указатель на ее первый символ (#6.7).
      Ключевое слово this является локальной переменной в теле функции члена (см. #8.5) . Оно является указателем на объект, для которого функция была вызвана.
      Выражение, заключенное в круглые скобки, является певичным выражением, чей тип и значение те же, что и у незаклченного в скобки выражения. Наличие скобок не влияет на то, является выражение lvalue или нет.
      Первичное выражение, за которым следует выражение в квадратных скобках, является первичным выражением. Интуитиный смысл – индекс. Обычно первичное выражение имеет тип «указатель на ...», индексирующее выражение имеет тип int и тип результата есть «...». Выражение Е1[Е2] идентично (по оределению) выражению *((E1)+(E2)). Все тонкие места, необхдимые для понимания этой записи, содержатся в этом разделе вместе с обсуждением в ## 7.1, 7.2 и 7.4, соответственно, идентификаторов, * и + ; ниже, в #8.4.2 приводятся следствия из этого.
      Вызов функции является первичным выражением, за которым следуют скобки, содержащие список (возможно, пустой) раздленных запятыми выражений, составляющих фактические параметры для функции. Первичное выражение должно иметь тип «функция, возвращающая ...» или «указатель на функцию, возвращающую ...», и результат вызова функции имеет тип «...».
      Каждый формальный параметр инициализируется фактическим параметром (#8.6). Выполняются стандартные (#6.6-8) и опредляемые пользователем преобразования (#8.5.6). Функция может изменять значения своих формальных параметров, но эти изменния не могут повлиять на значения фактических параметров за исключением случая, когда формальный параметр имеет ссылочный тип.
      Функция может быть описана как получающая меньше или больше параметров, чем специфицировано в описании функции (#8.4). Каждый фактический параметр типа float, для которого нет формального параметра, преобразуются к типу double; и, как обычно, имена массивов преобразуются к указателям. Пордок вычисления параметров не определен языком; имейте в виду различия между компиляторами.
      Допустимы рекурсивные вызовы любых функций.
      Первичное выражение, после которого стоит точка, за кторой следует идентификатор (или идентификатор, уточненный typedef-именем с помощью операции ::) является выражением. Первое выражение должно быть объектом класса, а идентификатор должен именовать член этого класса. Значением является именванный член объекта, и оно является адресным, если первое вражение является адресным. Следует отметить, что «классовые объекты» могут быть структурами (#8.5.12) или объединениями (#8.5.13).
      Первичное выражение, после которого стоит стрелка ( -»
      ), за которой следует идентификатор (или идентификатор, утоненный typedef-именем с помощью операции ::) является выражнием. Первое выражение должно быть указателем на объект класа, а идентификатор должен именовать член этого класса. Значение является адресом, ссылающимся на именованный член класса, на который указывает указательное выражение. Так, вражение E1-»MOS есть то же, что и (*E1).MOS. Классы обсуждются в #8.5.
      Если первичное выражение дает значение типа «указатель на ...» (см. #8.4 and #8.6.3), значением выражения был обект, обозначаемый ссылкой. Ссылку можно считать именем объета, см. #8.6.3.

7.2 Унарные Операции

      Выражения с унарными операциями группируют справа налво:
      унарное_выражение: унарная_операция выражение выражение ++ выражение – sizeof выражение sizeof ( имя_типа ) ( имя_типа ) выражение простое_имя_типа ( список_выражений ) new имя_типа инициализатор opt new ( имя_типа ) delete выражение delete [ выражение ] выражение унарная_операция: одна из * amp; – ! ~ ++ –
      Унарная операция * означает косвенное обращение: выражение должно быть указателем и результатом будет lvalue, ссылающееся на объект, на который указывает выражение. Если выражение имеет тип «указатель на ...», то тип результата есть «...».
      Результатом унарной операции amp; является указатель на объект, на который ссылается операнд. Операнд должен быть lvalue. Если выражение имеет тип «...», то тип результата есть «указатель на ...».

  • Страницы:
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20