Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Страустрап Б. Весь текст 579.17 Kb

Язык С++

Предыдущая страница Следующая страница
1 ... 41 42 43 44 45 46 47  48 49 50
  Определения функций имеют вид
     определение_функции:
          спецификаторы_описания описатель_функции  opt инициализа-
     тор_базового_класса                                        opt
          тело_функции
  Единственными cпецификаторами класса памяти (sc-cпецификаторами),
допустимыми  среди   спецификаторов  описания,   являются   extern,

                             - стр 303 -

static, overload,   inline  и virtual.   Описатель функции похож на
описатель "функции,  возвращающей ...", за исключением того, что он
включает в  себя имена  формальных параметров определяемой функции.
Описатель функции имеет вид
     описатель_функции:
          описатель ( список_описаний_параметров )
  Форма списка описаний параметров определена в #8.4.  Единственный
класс памяти,  который может  быть  задан,  это  тот,  при  котором
соответствующий фактический  параметр будет  скопирован,  если  это
возможно,  в   регистр  при   входе  в  функцию.  Если  в  качестве
инициализатора для  параметра задано  константное выражение, то это
значение используется как значение параметра по умолчанию.
  Тело функции имеет вид
     тело_функции:
          составной_оператор
  Вот простой пример полного определения функции:

  int max (int a,int b,int c)
    {
      int m = (a > b) ? a : b;
      return  (m > c) ? m : c;
    }

  Здесь int  является спецификатором  типа ; max (int a, int b, int
c) является  описателем функции  ; {  ... }  - блок, задающий текст
программы (код) оператора.
  Поскольку в  контексте выражения  имя (точнее, имя как формальный
параметр) считается означающим указатель на первый элемент массива,
то описания  формальных параметров,  описанных как "массив из ...",
корректируются так, чтобы читалось "указатель на ...".
  Инициализатор базового класса имеет вид
     инициализатор_базового_класса:
          : ( список_параметров opt )
 Он  используется  для  задания  параметров  конструктора  базового
класса в конструкторе производного класса. Например:

  struct base { base (int); ... };
  struct derived : base { derived (int); ... };

  derived.derived (int a) : (a+1) { ... }

  derived d (10);

Конструктор базового  класса вызывается  для объекта d с параметром
11.

     10.2 Определения внешних данных

  Определения внешних данных имеют вид
     определение_данных:
          описание
  Класс памяти таких данных статический.
  Если есть  более одного определения внешних данных одного именеи,
то определения  должны  точно  согласовываться  по  типу  и  классу

                             - стр 304 -

памяти, и  инициализаторы (если  они есть), должны иметь одинаковое
значение.

                11. ПРАВИЛА ОБЛАСТИ ВИДИМОСТИ

  См. #4.1.

              12. КОМАНДНЫЕ СТРОКИ КОМПИЛЯТОРА

  Компилятор языка  C++ содержит  препроцессор, способный выполнять
макроподстановки,  условную   компиляцию  и  включение  именованных
файлов. Строки,  начинающиеся с  #, относятся  к препроцессору. Эти
строки имеют  независимый от  остального языка синтаксис; они могут
появляться   в    любом   месте    оказывать    влияние,    которое
распространяется  (независимо   от  области   видимости)  до  конца
исходного файла программы.
  Заметьте, что  определения const  и inline  дают альтернативы для
большинства использований #define.

     12.1 Замена идентификаторов

  Командная строка компилятора имеет вид
     #define идент строка_символов
вызывает    замену     препроцессором     последующих     вхождений
идентификатора, заданного  строкой символов. Точка с запятой внутри
(или в конце) строки символов является частью этой строки.
  Строка вида
     #define идент( идент , ..., идент ) строка_символов
где отсутсвует  пробел между  первым идентификатором  и (, является
макроопределением  с  параметрами.  Последующие  вхождения  первого
идентификатора с  идущими за  ним (,  последовательностью символов,
разграниченной запятыми, и ), заменяются строкой символов, заданной
в определении.  Каждое местоположение идентификатора, замеченного в
списке параметров  определения, заменяется  соответствующей строкой
из  вызова.   Фактическими  параметрами   вызова  являются   строки
символов,  разделенные   запятыми;   однако   запятые   в   строке,
заключенной  в   кавычки,  или   в  круглых   скобках  не  являются
разделителями параметров. Число формальных и фактических параметров
должно совпадать. Строки и символьные константы в символьной строке
сканируются в поисках формальных параметров, но строки и символьные
константы  в   остальной  программе   не  сканируются   в   поисках
определенных (с помощью define) идентификаторов.
  В обоих  случаях строка  замещения еще  раз сканируется в поисках
других  определнных   идентификаторов.  В   обоих  случаях  длинное
определение может быть продолжено на другой строке с помощью записи
\ в конце продолжаемой строки.
  Командная строка вида
     #undef идент
влечет отмену препроцессорного определения идентификатора.

                             - стр 305 -

     12.2 Включение файлов

  Командная строка компилятора вида
     #include "имя_файла"
вызывает замену  этой строки  полным  содержимым  файла  имя_файла.
Сначала  именованный   файл  ищется  в  директории  первоначального
исходного  файла,  а  затем  в  стандартных  или  заданных  местах.
Альтернативный вариант, командная строка вида
      #include <имя_файла>
производит поиск только в стандартном или заданном месте, и не ищет
в директории  первоначального исходного  файла. (То,  как эти места
задаются, не является частью языка.)
  Включения с помощью #include могут быть вложенными.

     12.3 Условная компиляция

  Командная строка компилятора вида
     #if выражение
проверяет, является  ли результатом  вычисления выражения  не-ноль.
Выражение должно быть константным выражением, которые обсуждаются в
#15;  применительно   к   использованию   данной   директивы   есть
дополнительные  ограничения:   константное   выражение   не   может
содержать sizeof или перечислимые константы. Кроме обычных операций
C     может  использоваться  унарная  операция  defined.  В  случае
применения к  идентификатору она  дает значение  не-ноль, если этот
идентификатор был  ранее определен  с помощью #define и после этого
не было отмены определения с помощью #undef; иначе ее значение 0.
  Командная строка вида
     #ifdef идент
проверяет, определен  ли идентификатор  в  препроцессоре  в  данный
момент; то есть, был ли он объектом командной строки #define.
  Командная строка вида
     #ifndef идент
проверяет, является ли идентификатор неопределенным в препроцессоре
в данный момент.
  После строки  каждого из  трех видов  может  стоять  произвольное
количество строк, возможно, содержащих командную строку
     #else
и далее до командной строки
     #endif
  Если проверенное  условие истинно,  то все  строки между #else  и
#endif игнорируются.  Если проверенное условие ложно, то все строки
между проверкой  и #else  или, в  случае отсутствия  #else, #endif,
игнорируются.
  Эти конструкции могут быть вложенными.

     12.4 Управление строкой

  Для помощи  другим препроцессорам,  генерирующим программы  на C,
строка вида
     #line константа "имя_файла"
заставляет  компилятор   считать,  например,  в  целях  диагностики
ошибок, что константа задает номер следущей строки исходного файла,

                             - стр 306 -

и   текущий    входной   файл   именуется   идентификатором.   Есло
идентификатор отсутствует, то запомненное имя файла не изменяется.

                    13. НЕЯВНЫЕ ОПИСАНИЯ

  См. #8.1.

                       14. ОБЗОР ТИПОВ

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

     14.1 Классы

  Классовые объекты  могут присваиваться, передаваться функциям как
параметры и возвращаться функциями. Другие возможные операции, как,
например, проверка  равенства, могут быть определены пользователем;
см. #8.5.10.

     14.2 Функции

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

  typedef int (*PF) ();
  extern g (PF);
  extern f ();
  ...
  g (f);

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

  g (PF funcp)
    {
      ...
      (*funcp) ();
      ...
    }

  Заметьте, что  f должна быть описана явно в вызывающей программе,
поскольку ее появление в g(f) не сопровождалось (.

     14.3 Массивы, указатели и индексирование

  Всякий раз,  когда  в  выражении  появляется  идентификатор  типа
массива, он преобразуется в указатель на первый член массива. Из-за
преобразований  массивы   не  являются   адресами.  По  определению
операция индексирования  []  интерпретируется  таким  образом,  что

                             - стр 307 -

E1[E2]  идентично   *((E1)+(E2)).  В  силу  правил  преобразования,
применяемых к  +, если E1 массив и E2 целое, то E1[E2] отностится к
E2-ому члену  E1. Поэтому, несмотря на такое проявление асимметрии,
индексирование является коммутативной операцией.
  Это правило  сообразным образом применяется в случае многомерного
массива. Если  E является  n-мерным массивом  ранга i*j*...*k,   то
возникающее в выражении E преобразуется в указатель на (n-1)-мерный
массив ранга j*...*k.  Если к этому указателю, явно или неявно, как
результат индексирования,  применяется операция  *, ее  результатом
является (n-1)-мерный  массив, на  который указывалось, который сам
тут же преобразуется в указатель.
  Рассмотрим, например,

  int x[3][5];

  Здесь x  -  массив  целых  размером  3*5.  Когда  x  возникает  в
выражении, он  преобразуется в указатель на (первый из трех) массив
из 5  целых. В  выражении  x[i],  которое  эквивалентно  *(x+1),  x
сначала  преобразуется,   как  описано,   в  указатель,   затем   1
преобразуется к  типу x,  что включает  в себя умножение 1 на длину
объекта, на  который указывает  указатель, а  именно  объект  из  5
целых. Результаты  складываются, и используется косвенная адресация
для  получения  массива  (из  5  целых),  который  в  свою  очередь
преобразуется в  указатель на  первое из  целых. Если есть еще один
индекс, снова  используется  тот же параметр; на этот раз результат
является целым.
  Именно из всего этого проистекает то, что массивы в C хранятся по
строкам (быстрее  всего  изменяется  последний  индекс),  и  что  в
описании     первый  индекс   помогает  определить   объем  памяти,
поглощаемый  массивом,   но  не   играет  никакой   другой  роли  в
вычислениях индекса.

     14.4 Явные преобразования указателей

  Определенные преобразования,  включающие массивы, выполняются, но
имеют зависящие  от реализации  аспекты. Все они задаются с помощью
явной операции преобразования типов, см. ##7.2 и 8.7.
  Указатель иожет  быть  преобразован  к  любому  из  целых  типов,
достаточно больших  для его  хранения. То,  какой  из  int  и  long
требуется, является  машинно зависимым. Преобразующая функция также
является машинно  зависимой, но предполагается, что она не содержит
сюрпризов  для  того,  кто  знает  структуру  адресации  в  машине.
Подробности для некоторых конкретных машин были даны в #2.6.
  Объект целого  типа может  быть явно  преобразован  в  указатель.
Преобразующая  функция   всегда  превращает  целое,  полученное  из
указателя, обратно  в тот  же указатель,  но  в  остальных  случаях
является машинно зависимой.
  Указатель на  один тип  может быть  преобразован в  указатель  на
другой тип.  Использование результирующего указателя может вызывать
особые ситуации,  если исходный  указатель не  указывает на объект,
соответствующим образом  выравненный в  памяти. Гарантируется,  что
Предыдущая страница Следующая страница
1 ... 41 42 43 44 45 46 47  48 49 50
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (4)

Реклама