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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

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


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

Язык Си

Предыдущая страница Следующая страница
1 ... 26 27 28 29 30 31 32  33 34 35 36 37 38 39
ращения к функциям, группируются слева направо.

  Первичное выражение:
  идентификатор
  константа
  строка
  (выражение)
  первичное-выражение  [выражение]
  первичное-выражение  (список-выражений   нео
  первичное-L-значение . Идентификатор
  первичное-выражение -> идентификатор
  список-выражений:
  выражение
  список-выражений, выражение

Идентификатор является первичным выражением при условии, что
он описан подходящим образом, как это обсуждается ниже. тип
идентификатора определяется его описанием. Если, однако, ти-
пом идентификатора является "массив ...", то значением выра-
жения, состоящего из этого идентификатора , является указа-
тель на первый объект в этом массиве, а типом выражения бу-
дет "указатель на ...". Более того, идентификатор массива не
является выражением L-значения. подобным образом идентифика-
тор, который описан как "функция, возвращающая ...", за иск-
лючением того случая, когда он используется в позиции имени
функции при обращении, преобразуется в "указатель на функ-
цию, которая возвращает ...".
    Константа является первичным выражением. В зависимости
от ее формы типом константы может быть INT, LONG или DOUBLE.
    Строка является первичным выражением. Исходным ее типом
является "массив символов"; но следуя тем же самым правилам,
которые приведены выше для идентификаторов, он модифицирует-
ся в "указатель на символы", и результатом является указа-
тель на первый символ строки. (имеется исключение в некото-
рых инициализаторах; см. П. 16.6.)
    Выражение в круглых скобках является первичным выражени-
ем, тип и значение которого идентичны типу и значению этого
выражения без скобок. Наличие круглых скобок не влияет на
то, является ли выражение L-значением или нет.

    Первичное выражение, за которым следует выражение в
квадратных скобках, является первичным выражением. Интуитив-
но ясно, что это выражение с индексом. Обычно первичное вы-
ражение имеет тип "указатель на ...", индексное выражение
имеет тип INT, а типом результата является "...". Выражение
E1[E2] по определению идентично выражению * ((E1) + (E2)).
Все, что необходимо для понимания этой записи, содержится в
этом разделе; вопросы, связанные с понятием идентификаторов
и операций * и + рассматриваются в п.п. 15.1, 15.2 И 15.4
соответственно; выводы суммируются ниже в п. 22.3.
    Обращение к функции является первичным выражением, за
которым следует заключенный в круглые скобки возможно пустой
список выражений, разделенных запятыми, которые и представ-
ляют собой фактические аргументы функции. Первичное выраже-
ние должно быть типа "функция, возвращающая ...", а резуль-
тат обращения к функции имеет тип "...". Как указывается ни-
же, ранее не встречавщийся идентификатор, за которым непос-
редственно следует левая круглая скобка, считается описанным
по контексту, как представляющий функцию, возвращающую це-
лое; следовательно чаще всего встречающийся случай функции,
возвращающей целое значение, не нуждается в описании.
    Перед обращением любые фактические аргументы типа FLOAT
преобразуются к типу DOUBLE, любые аргументы типа CHAR или
SHORT преобразуются к типу INT, и, как обычно, имена масси-
вов преобразуются в указатели. Никакие другие преобразования
не выполняются автоматически; в частности, не сравнивает ти-
пы фактических аргументов с типами формальных аргументов.
Если преобразование необходимо, используйте явный перевод
типа (CAST); см. П.п. 15.2, 16.7.
    При подготовке к вызову функции делается копия каждого
фактического параметра; таким образом, все передачи аргумен-
тов в языке "C" осуществляются строго по значению. функция
может изменять значения своих формальных параметров, но эти
изменения не влияют на значения фактических параметров. С
другой строны имеется возможность передавать указатель при
таком условии, что функция может изменять значение объекта,
на который этот указатель указывает. Порядок вычисления ар-
гументов в языке не определен; обратите внимание на то, что
различные компиляторы вычисляют по разному.
    Допускаются рекурсивные обращения к любой функции.
    Первичное выражение, за которым следует точка и иденти-
фикатор, является выражением. Первое выражение должно быть
L-значением, именующим структуру или объединение, а иденти-
фикатор должен быть именем члена структуры или объединения.
Результатом является L-значение, ссылающееся на поименован-
ный член структуры или объединения.
    Первичное выражение, за которым следует стрелка (состав-
ленная из знаков - и >) и идентификатор, является выражени-
ем. первое выражение должно быть указателем на структуру или
объединение, а идентификатор должен именовать член этой
структуры или объединения. Результатом является L-значение,
ссылающееся на поименованный член структуры или объединения,
на который указывает указательное выражение.
    Следовательно, выражение E1->MOS является тем же самым,
что и выражение (*E1).MOS. Структуры и объединения рассмат-
риваются в п. 16.5. Приведенные здесь правила использования
структур и объединений не навязываются строго, для того что-
бы иметь возможность обойти механизм типов. См. П. 22.1.

     15.2. Унарные операции

    Выражение с унарными операциями группируется справо на-
лево.
 Унарное-выражение:
      *  выражение
      &  L-значение
      -  выражение
      !  Выражение
      \^ выражение
      ++ L-значение
      -- L-значение
      L-значение ++
      L-значение --
      (имя-типа) выражение
      SIZEOF выражение
      SIZEOF имя-типа

    Унарная операция * означает косвенную адресацию: выраже-
ние должно быть указателем, а результатом является L-значе-
ние, ссылающееся на тот объект, на который указывает выраже-
ние. Если типом выражения является "указатель на...", то ти-
пом результата будет "...".
    Результатом унарной операции & является указатель на
объект, к которому ссылается L-значение. Если L-значение
имеет тип "...", то типом результата будет "указатель на
...".
    Результатом унарной операции - (минус) является ее опе-
ранд, взятый с противоположным знаком. Для величины типа
UNSIGNED результат получается вычитанием ее значения из 2**N
(два в степени N), где N-число битов в INT. Унарной операции
+ (плюс) не существует.
    Результатом операции логического отрицания ! Является 1,
если значение ее операнда равно 0, и 0, если значение ее
операнда отлично от нуля. Результат имеет тип INT. Эта опе-
рация применима к любому арифметическому типу или указате-
лям.
    Операция \^ дает обратный код, или дополнение до едини-
цы, своего операнда. Выполняются обычные арифметические пре-
образования. Операнд должен быть целочисленного типа.
    Объект, на который ссылается операнд L-значения префикс-
ной операции ++, увеличивается. значением является новое
значение операнда, но это не L-значение. Выражение ++х экви-
валентно х+=1. Информацию о преобразованиях смотри в разборе
операции сложения (п. 15.4) и операции присваивания (п.
15.14).
    Префиксная операция -- аналогична префиксной операции
++, но приводит к уменьшению своего операнда L-значения.
    При применении постфиксной операции ++ к L-значению ре-
зультатом является значение объекта, на который ссылается
L-значение. После того, как результат принят к сведению,
объект увеличивается точно таким же образом, как и в случае
префиксной операции ++. Результат имеет тот же тип, что и
выражение L-значения.

    При применении постфиксной операции -- к L-значению ре-
зультатом является значение объекта, на который ссылается
L-значение. После того, как результат принят к сведению,
объект уменьшается точно таким же образом, как и в случае
префиксной операции --. Результат имеет тот же тип, что и
выражение L-значения.
    Заключенное в круглые скобки имя типа данных,стоящее пе-
ред выражением , вызывает преобразование значения этого вы-
ражения к указанному типу. Эта конструкция называется пере-
вод (CAST). Имена типов описываются в п. 16.7.
    Операция SIZEOF выдает размер своего операнда в байтах.
(Понятие байт в языке не определено, разве только как значе-
ние операции SIZEOF. Однако во всех существующих реализациях
байтом является пространство, необходимое для хранения
объекта типа CHAR). При применении к массиву результатом яв-
ляется полное число байтов в массиве. Размер определяется из
описаний объектов в выражении. Это выражение семантически
является целой константой и может быть использовано в любом
месте, где требуется константа. Основное применение эта опе-
рация находит при связях с процедурами, подобным распредели-
телям памяти, и в системах ввода- вывода.
    Операция SIZEOF может быть также применена и к заключен-
ному в круглые скобки имени типа. В этом случае она выдает
размер в байтах объекта указанного типа.
    Конструкция SIZEOF (тип) рассматривается как целое, так
что выражение SIZEOF (тип) - 2 эквивалентно выражению
(SIZEOF (тип)9 - 2.

     15.3. Мультипликативные операции

    Мультипликативные операции *, /, и % группируются слева
направо. Выполняются обычные арифметические преобразования.
  Мультипликативное-выражение:
  выражение * выражение
  выражение / выражение
  выражение % выражение
    Бинарная операция * означает умножение. Операция * ассо-
циативна, и выражения с несколькими умножениями на одном и
том же уровне могут быть перегруппированы компилятором.
    Бинарная операция / означает деление. При делении поло-
жительных целых осуществляется усечение по направлению к ну-
лю, но если один из операндов отрицателен, то форма усечения
зависит от используемой машины. На всех машинах, охватывае-
мых настоящим руководством, остаток имеет тот же знак , что
и делимое. Всегда справедливо, что (A/B)*B+A%B равно A (если
B не равно 0).
    Бинарная операция % выдает остаток от деления первого
выражения на второе. Выполняются обычные арифметические пре-
образования. Операнды не должны быть типа FLOAT.

     15.4. Аддитивные операции

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

 Аддитивное-выражение:
 выражение + выражение
 выражение - выражение

Результатом операции + является сумма операндов. Можно скла-
дывать указатель на объект в массиве и значение любого цело-
численного типа. во всех случаях последнее преобразуется в
адресное смещение посредством умножения его на длину объек-
та, на который указывает этот указатель. Результатом являет-
ся указатель того же самого типа, что и исходный указатель,
который указывает на другой объект в том же массиве, смещен-
ный соответствующим образом относительно первоначального
объекта. Таким образом, если P является указателем объекта в
массиве, то выражение P+1 является указателем на следующий
объект в этом массиве.
    Никакие другие комбинации типов для указателей не разре-
шаются.
    Операция + ассоциативна, и выражение с несколькими сло-
жениями на том же самом уровне могут быть переупорядочены
компилятором.
    Результатом операции - является разность операндов. Вы-
полняются обычные арифметические преобразования. Кроме того,
из указателя может быть вычтено значение любого целочислен-
ного типа, причем, проводятся те же самые преобразования,
что и при операции сложения.
    Если вычитаются два указателя на объекты одинакового ти-
па, то результат преобразуется (делением на длину объекта) к
типу INT, представляя собой число объектов, разделяющих ука-
зываемые объекты. Если эти указатели не на объекты из одного
и того же массива, то такое преобразование, вообще говоря,
даст неожиданные результаты, потому что даже указатели на
объекты одинакового типа не обязаны отличаться на величину,
кратную длине объекта.

     15.5. Операции сдвига

    Операции сдвига << и >> группируются слева направо. Для
Предыдущая страница Следующая страница
1 ... 26 27 28 29 30 31 32  33 34 35 36 37 38 39
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама