Справочное руководство по C++
Шрифт:
Бинарная операция .* связывает свой второй операнд, который должен иметь тип "указатель на член класса T", с первым операндом, имеющим тип класс T или такой класс, для которого T является однозначно определенным и достижимым базовым классом. Результатом будет объект или функция с типом, задаваемым вторым операндом.
Бинарная операция -›* связывает свой второй операнд, который должен иметь тип "указатель на член класса T", с первым операндом, имеющим тип "указатель на T" или тип "указатель на класс, для которого T является однозначно определенным
Если результат .* или -›* есть функция, то его можно использовать только в качестве операнда операции вызова функции , например, операция
приводит к вызову функции-члена, обозначенной ptr_to_mfct, для объекта, на который настроен указатель ptr_to_obj. Результат операции .* или -›* является адресом, если второй операнд есть адрес.
R.5.6 Мультипликативные операции
Мультипликативные операции *, /, и % выполняются слева направо.
Операнды операций * и / должны иметь арифметический тип, операнды для % должны быть целочисленного типа. Обычные арифметические преобразования (§R.4.5) производятся над операндами и определяют тип результата.
Бинарная операция * обозначает умножение.
Бинарная операция / вычисляет частное, а бинарная операция % вычисляет остаток от деления первого выражения на второе. Если второй операнд у / или % есть 0, результат неопределен, иначе (a/b)*b + a%b должно равняться a. Если оба операнда неотрицательны, то таким же будет и результат, в противном случае знак результата определяется реализацией.
R.5.7 Аддитивные операции
Аддитивные операции + и - выполняются слева направо, при этом происходят обычные арифметические преобразования (§R.4.5) операндов арифметического типа.
Операнды должны быть арифметического типа или типа указателя. Результатом операции + является сумма операндов. Можно складывать указатель на объект в массиве и значение любого целочисленного типа. Результатом будет указатель того же типа, что и исходный указатель, но он будет настроен на другой объект массива с заданным смещением от исходного объекта. Так, если P есть указатель на объект массива, выражение P+1 является указателем на следующий объект массива. Если же получившийся в результате сложения указатель вышел за границы массива, результат будет неопределенным, кроме случая, когда указатель настроен на первый адрес больший верхней границы массива.
Результатом операции - будет разность операндов. Значение любого целочисленного типа можно вычитать из указателя, при этом применяются те же преобразования, что и для операции +.
Никакие другие сочетания типов для указателей не допустимы.
Если вычитаются два указателя на объекты одного типа, результатом будет целочисленное значение со знаком, которое показывает на сколько объектов этого типа отстоят друг от друга
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) этих членов различны, результат будет не определен. Если два указателя настроены на члены (данные) одного и того же объединения, они считаются равными. Если два указателя настроены на элементы одного массива или смотрят за границу массива, то указатель, настроенный на элемент с большим индексом, будет большим. Все другие сравнения указателей определяются реализацией.