Следующие выражения вызывают ошибку компиляции из-за неправильно понятого приоритета операций. Объясните, как их исправить, используя таблицу 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;
// обычно компилируется с предупреждением