Программирование >>  Арифметические и логические операции 

1 2 3 4 [ 5 ] 6 7 8 ... 53


Операция побитовое исключающее ИЛИ

Синтаксис:

выражение выражение

Операция ассоциативна, и выражения, содержащие , могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция исключающее ИЛИ операндов. Операция применяется только к целым операндам.

Операция побитовое включающее ИЛИ

Синтаксис:

выражение выражение

Операция ассоциативна, и выражения, содержащие , могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция включающее ИЛИ операндов. Операция применяется только к целым операндам.

Операция логическое И

Синтаксис:

выражение && выражение

Операция && группирует слева направо. Она возвращает 1, если оба операнда ненулевые, и 0 в противном случае. В противоположность операции & операция && гарантирует вычисление слева направо; более того, второй операнд не вычисляется, если первый операнд есть 0.

Операнды не обязаны иметь один и тот же тип, но каждый из них должен иметь один из основных типов или быть указателем. Результат всегда имеет тип int.

Операция логическое ИЛИ

Синтаксис:

выражение выражение

Операция группирует слева направо. Она возвращает 1, если хотя бы один из ее операндов ненулевой, и 0 в противном случае. В противоположность операции операция гарантирует вычисление слева направо; более того, второй операнд не вычисляется, если первый операнд не есть 0.

Операнды не обязаны иметь один и тот же тип, но каждый из них должен иметь один из основных типов или быть указателем. Результат всегда имеет тип int.

Условная операция

Синтаксис:

выражение ? выражение : выражение

Условная операция группирует слева направо. Вычисляется первое выражение, и если оно не 0, то результатом является значение второго выражения, в противном случае значение третьего выражения.

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

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

Операции присваивания

Есть много операций присваивания, все группируют слева направо. Все в качестве левого операнда требуют lvalue, и тип выражения присваивания тот же, что и у его левого операнда. Это lvalue не может ссылаться на константу (имя массива, имя функции или const).

Значением является значение, хранящееся в левом операнде после выполнения присваивания.

Синтаксис:

выражение операция присваивания выражение Где операция присваивания - одна из:

>>=

<<=

&=



♦ =

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

Если аргумент в левой части имеет указательный тип, аргумент в правой части должен быть того же типа или типа, который может быть преобразован к нему.

Оба операнда могут быть объектами одного класса. Могут присваиваться объекты некоторых производных классов.

Присваивание объекту типа указатель на ... выполнит присваивание объекту, денотируемому ссылкой.

Выполнение выражения вида E1 op= E2 можно представить себе как эквивалентное E1 = E1 op (E2); но E1 вычисляется только один раз.

В += и -= левый операнд может быть указателем, и в этом случае (интегральный) правый операнд преобразуется так, как объяснялось выше; все правые операнды и не являющиеся указателями левые должны иметь арифметический тип.

Операция запятая

Синтаксис:

выражение , выражение

Пара выражений, разделенных запятой, вычисляется слева направо, значение левого выражения теряется. Тип и значение результата являются типом и значением правого операнда. Эта операция группирует слева направо.

В контексте, где запятая имеет специальное значение, как например в списке фактических параметров функции и в списке инициализаторов, операция запятая, как она описана в этом разделе, может появляться только в скобках.

Например:

f (a,(t=3,t+2),c) имеет три параметра, вторым из которых является значение 5.

Перегруженные операции

Большинство операций может быть перегружено, то есть, описано так, чтобы они получали в качестве операндов объекты классов. Изме-

нить приоритет операций невозможно. Невозможно изменить смысл операций при применении их к неклассовым объектам.

Предопределенный смысл операций = и & (унарной) при применении их к объектам классов может быть изменен.

Эквивалентность операций, применяемых к основным типам (например, ++a эквивалентно a+=1), не обязательно выполняется для операций, применяемых к классовым типам. Некоторые операции, например, присваивание, в случае применения к основным типам требуют, чтобы операнд был lvalue; это не требуется для операций, описанных для классовых типов.

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

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

Так, для любой унарной операции @, x@ и @x могут интерпретироваться как х.операция@() или операция@(х). При перегрузке операций ++ и -- невозможно различить префиксное и постфиксное использование.

Бинарные операции

Бинарная операция может быть определена или с помощью функции члена, получающей один параметр, или с помощью функции друга, получающей два параметра, но не двумя способами одновременно. Так, для любой бинарной операции @, x@y может быть проинтерпретировано как х.операция@(у) или операция@(х,у).

Особые операции

Вызов функции:

первичное выражение (список выражений opt) и индексирование

первичное выражение [выражение]

считаются бинарными операциями. Именами определяющей функции являются соответственно operator() и operator[]. Обращение x(arg) интерпретируется как x.operator()(arg) для классового объекта x. Индексирование x[y] интерпретируется как x.operator[](y).



Глава 14. Описания

Описания используются для определения интерпретации, даваемой каждому идентификатору; они не обязательно резервируют память, связанную с идентификатором. Описания имеют вид:

спецификаторы описания opt список описателей opt;

описание имени

а8т описание

Описатели в списке описателей содержат идентификаторы, подлежащие описанию. Спецификаторы описания могут быть опущены только в определениях внешних функций или в описаниях внешних функций. Список описателей может быть пустым только при описании класса или перечисления, то есть, когда спецификаторы описания - это class спецификатор или enum спецификатор.

Список должен быть внутренне непротиворечив в описываемом ниже смысле.

Глава 15.

Спецификаторы класса памяти

Спецификаторы класса памяти (sc-спецификатор) это:

♦ auto

♦ static

♦ extern

♦ register

Описания, использующие спецификаторы auto, static и register

также служат определениями тем, что они вызывают резервирование соответствующего объема памяти. Если описание extern не является определением, то где-то еще должно быть определение для данных идентификаторов.

Описание register лучше всего представить как описание auto (автоматический) с подсказкой компилятору, что описанные переменные усиленно используются. Подсказка может быть проигнорирована. К ним не может применяться операция получения адреса &.

Спецификаторы auto или register могут применяться только к именам, описанным в блоке, или к формальным параметрам. Внутри блока не может быть описаний ни статических функций, ни статических формальных параметров.

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

Спецификаторы static и extern могут использоваться только для имен объектов и функций.

Некоторые спецификаторы могут использоваться только в описаниях функций:

♦ overload

♦ inline

♦ virtual

Спецификатор перегрузки overload делает возможным использование одного имени для обозначения нескольких функций.

Спецификатор inline является только подсказкой компилятору, не влияет на смысл программы и может быть проигнорирован.

Он используется, чтобы указать на то, что при вызове функции inline - подстановка тела функции предпочтительнее обычной реализации вызова функции. Функция, определенная внутри описания класса, является inline по умолчанию. Спецификатор virtual может использоваться только в описаниях членов класса.

Спецификатор friend используется для отмены правил сокрытия имени для членов класса и может использоваться только внутри описаний классов. С помощью спецификатора typedef вводится имя для типа.

Спецификаторы Типа

Спецификаторами типов (спецификатор типа) являются:

спецификатор типа:

простое имя типа

с1а88 спецификатор

enum-спецификатор сложный спецификатор типа const

Слово const можно добавлять к любому допустимому специфика-тору типа. В остальных случаях в описании может быть дано не более од-



1 2 3 4 [ 5 ] 6 7 8 ... 53

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика