C++
Шрифт:
7.7 Операции равенства
выражение_равенства: выражение == выражение выражение != выражение
Операции == и != в точности аналогичны операциям сравнния за исключением их низкого приоритета. (Так, a«b == c«d есть 1 всегда, когда a«b и c«d имеют одинаковое истинностное значение.)
Указатель может сравниваться с 0.
7.8 Операция побитовое И
И-выражение: выражение amp; выражение
Операция amp; ассоциативна, и выражения, содержащие amp;,
7.9 Операция побитовое исключающее ИЛИ
исключающее_ИЛИ_выражение: выражение ^ выражение
Операция ^ ассоциативна, и выражения, содержащие ^, мгут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция исключающее ИЛИ операндов. Операция применяется только к целым операндам.
7.10 Операция побитовое включающее ИЛИ
включающее_ИЛИ_выражение: выражение ! выражение
Операция ! ассоциативна, и выражения, содержащие !, мгут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция вклчающее ИЛИ операндов. Операция применяется только к целым операндам.
7.11 Операция логическое И
логическое_И_выражение: выражение amp; amp; выражение
Операция amp; amp; группирует слева направо. Она возвращает 1, если оба операнда ненулевые, и 0 в противном случае. В протвоположность операции amp; операция amp; amp; гарантирует вычисление слева направо; более того, второй операнд не вычисляется, ели первый операнд есть 0.
Операнды не обязаны иметь один и тот же тип, но каждый из них должен иметь один из основных типов или быть указатлем. Результат всегда имеет тип int.
7.12 Операция логическое ИЛИ
логическое_ИЛИ_выражение: выражение !! выражение
Операция !! группирует слева направо. Она возвращает 1, если хотя бы один из ее операндов ненуелвой, и 0 в противном случае. В противоположность операции ! операция !! гарантирет вычисление слева направо; более того, второй операнд не вычисляется, если первый операнд не есть 0.
Операнды не обязаны иметь один и тот же тип, но каждый из них должен иметь один из основных типов или быть указатлем. Результат всегда имеет тип int.
7.13 Условная операция
условное_выражение: выражение ? выражение : выражение
Условная операция группирует слева направо. Вычисляется первое выражение, и если оно не 0, то результатом является значение второго выражения, в противном случае значение третьего выражения. Если это возможно, то выполняются обычные арифметические преобразования для приведения второго и третего выражения к общему типу. Если это возможно, то выполняюся преобразования указателей для приведения второго и третего выражения к общему типу. Вычисляется только одно из второго и третьего выражений.
7.14 Операции присваивания
Есть много операций присваивания, все группируют слева направо. Все в качестве левого операнда требуют lvalue, и тип выражения присваивания тот же, что и у его левого операнда. Это lvalue не может ссылаться на константу (имя массива, имя функции или const). Значением является значение, хранящееся в левом операнде просле выполнения присваивания.
выражение_присваивания:
выражение операция_присваивания выражение
операция_присваивания: одна из
= += -= *= /= %= »»= ««= amp;= ~= !=
В простом присваивании с = значение выражения замещает собой значение объекта, на который ссылается операнд в левой части. Если оба операнда имеют арифметический тип, то при подготовке к присваиванию правый операнд преобразуется к типу левого. Если аргумент в левой части имеет указательный тип, аргумент в правой части должен быть того же типа или типа, который может быть преобразован к нему, см. #6.7. Оба операда могут быть объектами одного класса. Могут присваиваться объекты некоторых производных классов, см. #8.5.3.
Присваивание объекту типа «указатель на ...» выполнит присваивание объекту, денотируемому ссылкой.
Выполнение выражения вида E1 op= E2 можно представить себе как эквивалентное E1 = E1 op (E2); но E1 вычисляется только один раз. В += и -= левый операнд может быть указатлем, и в этом случае (целочисленный) правый операнд преобрзуется так, как объяснялось в #7.4; все правые операнды и не являющиеся указателями левые должны иметь арифметический тип.
7.15 Операция запятая
запятая_выражение: выражение , выражение
Пара выражений, разделенных запятой, вычисляется слева направо, значение левого выражения теряется. Тип и значение результата являются типом и значением правого операнда. Эта операция группирует слева направо. В контексте, где запятая имеет специальное значение, как например в списке фактических параметров функции (#7.1) и в списке инициализаторов (#8.6), операция запятая, как она описана в этом разделе, может пояляться только в скобках; например,
f (a,(t=3,t+2),c)
имеет три параметра, вторым из которых является значение 5.
7.16 Перегруженные операции
Большинство операций может быть перегружено, то есть, описано так, чтобы они получали в качестве операндов объекты классов (см. #8.5.11). Изменить приоритет операций невозмоно. Невозможно изменить смысл операций при применении их к неклассовым объектам. Предопределенный смысл операций = и amp; (унарной) при применении их к объектам классов может быть именен.