|
Программирование >> Арифметические и логические операции
Операция побитовое исключающее ИЛИ Синтаксис: выражение выражение Операция ассоциативна, и выражения, содержащие , могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция исключающее ИЛИ операндов. Операция применяется только к целым операндам. Операция побитовое включающее ИЛИ Синтаксис: выражение выражение Операция ассоциативна, и выражения, содержащие , могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция включающее ИЛИ операндов. Операция применяется только к целым операндам. Операция логическое И Синтаксис: выражение && выражение Операция && группирует слева направо. Она возвращает 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 можно добавлять к любому допустимому специфика-тору типа. В остальных случаях в описании может быть дано не более од-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |