Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

 выражение-pm .* выражение-приведения

 выражение-pm -›* выражение-приведения

Бинарная операция .* связывает свой второй операнд, который должен иметь тип "указатель на член класса T", с первым операндом, имеющим тип класс T или такой класс, для которого T является однозначно определенным и достижимым базовым классом. Результатом будет объект или функция с типом, задаваемым вторым операндом.

Бинарная операция -›* связывает свой второй операнд, который должен иметь тип "указатель на член класса T", с первым операндом, имеющим тип "указатель на T" или тип "указатель на класс, для которого T является однозначно определенным

и достижимым базовым классом". Результатом будет объект или функция с типом, задаваемым вторым операндом.

Если результат .* или -›* есть функция, то его можно использовать только в качестве операнда операции вызова функции , например, операция

(ptr_to_obj-›*ptr_to_mfct)(10);

приводит к вызову функции-члена, обозначенной ptr_to_mfct, для объекта, на который настроен указатель ptr_to_obj. Результат операции .* или -›* является адресом, если второй операнд есть адрес.

R.5.6 Мультипликативные операции

Мультипликативные операции *, /, и % выполняются слева направо.

Мультипликативное-выражение:

 выражение-pm

 мультипликативное-выражение * выражение-pm

 мультипликативное-выражение / выражение-pm

 мультипликативное-выражение % выражение-pm

Операнды операций * и / должны иметь арифметический тип, операнды для % должны быть целочисленного типа. Обычные арифметические преобразования (§R.4.5) производятся над операндами и определяют тип результата.

Бинарная операция * обозначает умножение.

Бинарная операция / вычисляет частное, а бинарная операция % вычисляет остаток от деления первого выражения на второе. Если второй операнд у / или % есть 0, результат неопределен, иначе (a/b)*b + a%b должно равняться a. Если оба операнда неотрицательны, то таким же будет и результат, в противном случае знак результата определяется реализацией.

R.5.7 Аддитивные операции

Аддитивные операции + и - выполняются слева направо, при этом происходят обычные арифметические преобразования (§R.4.5) операндов арифметического типа.

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

 мультипликативное-выражение

 аддитивное выражение + мультипликативное-выражение

 аддитивное-выражение - мультипликативное-выражение

Операнды должны быть арифметического типа или типа указателя. Результатом операции + является сумма операндов. Можно складывать указатель на объект в массиве и значение любого целочисленного типа. Результатом будет указатель того же типа, что и исходный указатель, но он будет настроен на другой объект массива с заданным смещением от исходного объекта. Так, если P есть указатель на объект массива, выражение P+1 является указателем на следующий объект массива. Если же получившийся в результате сложения указатель вышел за границы массива, результат будет неопределенным, кроме случая, когда указатель настроен на первый адрес больший верхней границы массива.

Результатом операции - будет разность операндов. Значение любого целочисленного типа можно вычитать из указателя, при этом применяются те же преобразования, что и для операции +.

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

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

указуемые объекты. Указатели на соседние элементы массива отстоят на 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) этих членов различны, результат будет не определен. Если два указателя настроены на члены (данные) одного и того же объединения, они считаются равными. Если два указателя настроены на элементы одного массива или смотрят за границу массива, то указатель, настроенный на элемент с большим индексом, будет большим. Все другие сравнения указателей определяются реализацией.

Поделиться:
Популярные книги

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Береги честь смолоду

Вяч Павел
1. Порог Хирург
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Береги честь смолоду

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Физрук: назад в СССР

Гуров Валерий Александрович
1. Физрук
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Физрук: назад в СССР

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

(не)Бальмануг.Дочь

Лашина Полина
7. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг.Дочь

Внешняя Зона

Жгулёв Пётр Николаевич
8. Real-Rpg
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Внешняя Зона

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Везунчик. Проводник

Бубела Олег Николаевич
3. Везунчик
Фантастика:
фэнтези
6.62
рейтинг книги
Везунчик. Проводник

Особое назначение

Тесленок Кирилл Геннадьевич
2. Гарем вне закона
Фантастика:
фэнтези
6.89
рейтинг книги
Особое назначение

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Проклятый Лекарь IV

Скабер Артемий
4. Каратель
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь IV