Программирование >>  Инициализация объектов класса, структура 

1 ... 53 54 55 [ 56 ] 57 58 59 ... 395


4 * ( 5 + 7 * 2 ) ==> 7 6 4 * ( (5 + 7) * 2 ) ==> 96

Вот как с помощью скобок исправить поведение предыдущего примера:

while ( (ch = nextChar()) != \n )

Операторы обладают и приоритетом, и ассоциативностью. Оператор присваивания правоассоциативен, поэтому вычисляется справа налево:

ival = jval = kva1 = lval

Сначала kval получает значение lval, затем jval - значение результата этого присваивания, и в конце концов ival получает значение jval.

Арифметические операции, наоборот, левоассоциативны. Следовательно, в выражении

ival + jval + kva1 + 1va1

сначала складываются ival и jval, потом к результату прибавляется kval, а затем и

lval.

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

Упражнение 4.18

(a) ! ptr == ptr->next

(b) ~ uc 0377 & ui << 4

Каков порядок вычисления следующих выражений? При ответе используйте таблицу 4.4.

i (c) ch = buf[ bp++ ] != \n Упражнение 4.19

Следующая конструкция ведет себя не так, как можно было бы ожидать. Приоритет операции присваивания меньше, чем операции сравнения:

while ( ch = nextChar() != \n )

Программист хотел присвоить переменной ch значение, а затем проверить, равно ли оно символу новой строки. Однако на самом деле выражение сначала сравнивает значение, полученное от nextChar(), с \n, и результат - true или false - присваивает переменной ch.

Приоритеты операций можно изменить с помощью скобок. Выражения в скобках вычисляются в первую очередь. Например:



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

Упражнение 4.20

Следующие выражения вызывают ошибку компиляции из-за неправильно понятого

(a) int i

doSomething(), 0;

приоритета операций. Объясните, как их исправить, используя таблицу 4.4.

i (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 cast

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

const cast<type>(expr)

dynamic cast

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

dynamic cast<type>(expr)

reinterpret cast

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

reinterpret cast<type> (expr)

static cast

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

static cast<type>(expr)

sizeof

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

sizeof expr

sizeof

размер типа

sizeof( type)

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

++lvalue

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

-lvalue



побитовое НЕ

~expr

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

!expr

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

-expr

унарный плюс

+expr

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

*expr

&

адрес

&expr

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

(type)expr

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

new type

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

new type(exprlist)

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

new (exprlist) type(exprlist)

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

все формы

delete

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

все формы

delete

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

все формы

->*

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

pointer-> *pointer to member

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

object.*pointer to memiber

умножение

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



1 ... 53 54 55 [ 56 ] 57 58 59 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика