Выбрать главу

Никакие другие сочетания типов для указателей не допустимы.

Если вычитаются два указателя на объекты одного типа, результатом будет целочисленное значение со знаком, которое показывает на сколько объектов этого типа отстоят друг от друга указуемые объекты. Указатели на соседние элементы массива отстоят на 1. Тип результата зависит от реализации, но он должен быть определен как ptrdiff_t в стандартном заголовочном файле ‹stddef.h›. Результат не определен, если указатели не настроены на элементы одного массива. Если P есть указатель на последний элемент массива, то (P+1) - 1 есть P.

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

Операции сдвигов ‹‹ и ›› выполняются слева направо.

сдвиговое-выражение:

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

 сдвиговое-выражение ‹‹ аддитивное выражение

 сдвиговое-выражение ›› аддитивное выражение

Операнды должны быть целочисленного типа, и над ними производятся стандартные целочисленные преобразования. Тип результата совпадает с типом преобразованного левого операнда. Результат не определен, если правый операнд отрицателен или больше или равен числу разрядов в двоичном представлении преобразованного левого операнда. Значением выражения E1‹‹E2 будет E1 (рассматриваемое как набор разрядов), сдвинутое влево на E2 разрядов, причем освободившиеся разряды заполняются нулями. Значением выражения E1››E2 будет E1, сдвинутое вправо на E2 разрядов. Если E1 беззнакового типа или имеет неотрицательное значение, гарантируется, что сдвиг вправо - логический (заполнение нулями), иначе результат зависит от реализации.

R.5.9 Операции отношения

Операции отношения выполняются слева направо, но этот факт мало что дает, ибо выражение a‹b‹c означает (a‹b)‹c, а вовсе не (a‹b)&&(b‹c).

выражение-отношения:

 сдвиговое-выражение

 выражение-отношения ‹ сдвиговое-выражение

 выражение-отношения › сдвиговое-выражение

 выражение-отношения ‹= сдвиговое-выражение

 выражение-отношения ›= сдвиговое-выражение

Операнды должны быть арифметического типа или типа указателей. Операции ‹ (меньше чем), › (больше чем), ‹= (меньше или равно) и ›= (больше или равно) дают результат 0, если указанное отношение не выполняется, и 1, если оно выполняется. Тип результата int.

Над арифметическими операндами выполняются обычные арифметические преобразования. Над указателями выполняются обычные преобразования указателей. Предполагается, что любой указатель можно сравнить с выражением, имеющим результат 0, и любой указатель можно сравнить с указателем, имеющим тип void* (в этом случае указатель сначала преобразуется к типу void*). Указатели на объекты или функции одного типа (после преобразования указателей) можно сравнивать, результат зависит от взаимного расположения в памяти объектов или функций.

Два указателя на один и тот же объект считаются равными. Если два указателя настроены на нестатические члены одного объекта, то указатель, настроенный на член, описанный позднее, считается большим, при условии, что члены не имеют разных спецификаций указатель-доступа (§R.11.1), а класс не является объединением. Если два указателя настроены на нестатические члены одного объекта и спецификации указателей-доступа (§R.11.1) этих членов различны, результат будет не определен. Если два указателя настроены на члены (данные) одного и того же объединения, они считаются равными. Если два указателя настроены на элементы одного массива или смотрят за границу массива, то указатель, настроенный на элемент с большим индексом, будет большим. Все другие сравнения указателей определяются реализацией.

R.5.10 Операции сравнения на равенство

выражение-равенства:

 выражение-отношения

 выражение-равенства == выражение-отношения

 выражение-равенства != выражение-отношения

Операции == (равно) и != (не равно) аналогичны операциям отношения, за исключением того, что их приоритет ниже. (Таким образом, операция a‹b == c‹d дает результат 1, если выражения a‹b и c‹d имеют одно и то же значение.)

Кроме этого, можно сравнивать указатели на члены одного типа. Производятся преобразования указателя на член (§R.4.8). Указатель на член можно сравнить с выражением-константой, которое дает результат 0.

R.5.11 Поразрядная операция И

выражение-И:

 выражение-равенства

 выражение-И & выражение-равенства

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