Читать «Справочное руководство по C++» онлайн - страница 26

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

Операнды не обязательно имеют одинаковый тип, но каждый должен быть арифметического типа или типа указателя. Тип результата int. Все побочные эффекты вычисления первого выражения могут возникать до вычисления второго выражения.

R.5.16 Операция условия

выражение-условия:

 логическое-выражение-ИЛИ

 логическое-выражение-ИЛИ ? выражение : выражение-условия

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

Если второе и третье выражение арифметического типа, и типы их совпадают, то таким же будет и тип результата, если они различаются, то выполняются обычные арифметические преобразования, чтобы привести их к общему типу. Если второе и третье выражение являются указателями или выражением-константой, дающим результат 0, выполняются преобразования указателей, чтобы привести результаты выражений к общему типу. Если второе и третье выражение являются ссылками, выполняется преобразование ссылок, чтобы привести их к общему типу. Если второе и третье выражение имеют тип void, общий тип будет void. Если второе и третье выражение имеют один тип класс T, общим типом будет T. Иначе, выражение считается недопустимым. Тип результата есть общий тип. Вычисляется только второе или третье выражение (но не оба). Результат будет адресом, если второй и третий операнд одного типа и являются адресами.

R.5.17 Операции присваивания

Существует несколько операций присваивания, все они выполняются справа налево. Для всех них требуется, чтобы левым операндом был изменяемый адрес. Тип выражения присваивания совпадает с типом левого операнда. Результат операции присваивание - значение, хранящееся в левом операнде после того как произошло присваивание. Результат является адресом.

выражение-присваивания:

 выражение-условия

 унарное-выражение операция-присваивания выражение-присваивания

операция-присваивания: один из

 = *= /= %= += -= ››= ‹‹= &= ^= |=

При простом присваивании (=) значение выражения заменяет собой значение объекта, с которым сопоставляется левый операнд. Если оба операнда арифметического типа, правый операнд, прежде чем произойдет присваивание, преобразуется к типу левого операнда. Неявные преобразования к типу перечисления (§R.7.2) не производятся, поэтому если левый операнд имеет тип перечисления, правый операнд должен быть таким же. Если левый операнд имеет тип указателя, правый операнд должен быть типа указателя или выражением-константой, дающим результат 0. Правый операнд преобразуется к типу левого операнда, прежде выполнения присваивания.