Выбрать главу
Упражнение 4.20

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

(a) int i = doSomething(), 0;

(b) cout ival % 2 ? "odd" : "even";

Таблица 4.4. Приоритеты операций

Оператор

Значение

Использование

::

Глобальная область видимости

::name

::

Область видимости класса

class::name

::

Область видимости пространства имен

namespace::name

.

Доступ к члену

object.member

-

Доступ к члену по указателю

pointer-member

[]

Взятие индекса

variable[expr]

()

Вызов функции

name(expr_list)

()

Построение значения

type(expr_list)

++

постфиксный инкремент

lvalue++

постфиксный декремент

lvalue--

typeid

идентификатор типа

typeid(type)

typeid

идентификатор типа выражения

typeid(expr)

преобразование типа

const_casttype(expr)

преобразование типа

dynamic_casttype(expr)

reinterpret_cast

приведение типа

reinterpret_casttype (expr)

static_cast

приведение типа

static_casttype(expr)

sizeof

размер объекта

sizeof expr

sizeof

размер типа

sizeof( type)

++

префиксный инкремент

++lvalue

--

префиксный декремент

--lvalue

~

побитовое НЕ

~expr

!

логическое НЕ

!expr

-

унарный минус

-expr

+

унарный плюс

+expr

*

разыменование

*expr

адрес

expr

()

приведение типа

(type)expr

new

выделение памяти

new type

new

выделение памяти и инициализация

new type(exprlist)

new

Выделение памяти под массив

все формы

delete

освобождение памяти

все формы

delete

освобождение памяти из-под массива

все формы

-*

доступ к члену классу по указателю

pointer- *pointer_to_member

.*

доступ к члену класса по указателю

object.*pointer_to_member

*

Умножение

expr * expr

/

Деление

expr / expr

%

деление по модулю

expr % expr

+

сложение

expr + expr

-

вычитание

expr - expr

сдвиг влево

expr expr

сдвиг вправо

expr expr

меньше

expr expr

=

меньше или равно

expr = expr

больше

expr expr

=

больше или равно

expr = expr

==

равно

expr == expr

!=

не равно

expr != expr

побитовое И

expr expr

^

побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ

expr ^ expr

|

побитовое ИЛИ

expr | expr

логическое И

expr expr

||

логическое ИЛИ

expr || expr

?:

условный оператор

expr ? expr * expr

=

присваивание

l-значение = expr

=, *=, /=, %=, +=, -=, =, =, =, |=, ^=

составное присваивание

l-значение += expr и т.д.

throw

возбуждение исключения

throw expr

,

запятая

expr, expr

4.14. Преобразования типов

Представим себе следующий оператор присваивания:

int ival = 0;

// обычно компилируется с предупреждением