Программирование >>  Поддержка объектно-ориентированного программирования 

1 ... 21 22 23 [ 24 ] 25 26 27 ... 120


Разрешение области видимости

class name :: member

Глобальное

:: name

Выбор члена

object . member

->

Выбор члена

pointer -> member

Индексирование

pointer [ expr ]

Вызов функции Структурное значение

expr ( expr list )

type ( expr list )

sizeof

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

sizeof expr

sizeof

Размер типа

sizeof ( type )

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

lvalue ++

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

++ lvalue

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

lvalue --

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

-- lvalue

Дополнение

~ expr

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

! expr

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

- expr

Унарный плюс

+ expr

&

Взятие адреса

& lvalue

Косвенность

* expr

Создание (размещение)

new type

delete

Уничтожение (освобождение)

delete pointer

delete[]

Уничтожение массива

delete[] pointer

Приведение (преобразование)типа

( type ) expr

Выбор члена косвенный

object . pointer-to-member

->*

Выбор члена косвенный

pointer -> 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 A expr

Поразрядное включающее ИЛИ

expr I expr

&&

Логическое И

expr && expr

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

expr 11 expr

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

expr? expr: expr

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

lvalue = expr

Присваивание с умножением

lvalue *= expr

Присваивание с делением

lvalue /= expr

Присваивание с взятием остатка от деления

lvalue %= expr

Присваивание со сложением

lvalue += expr

Присваивание с вычитанием

lvalue -= expr

<< =

Присваивание со сдвигом влево

lvalue <<= expr



>>=

Присваивание со сдвигом вправо

lvalue >>= expr

&=

Присваивание с поразряднгм И

lvalue &= expr

Присваивание с поразряднгм включающим ИЛИ

lvalue \ = expr

Присваивание с поразряднгм исключающим ИЛИ

lvalue = expr

Запятая (последовательность)

expr, expr

Все операции таблицы, находящиеся между двумя ближайшими друг к другу горизонтальными чертами, имеют одинаковый приоритет. Приоритет операций уменьшается при движении сверху вниз . Например, a+b*c означает a+(b*c), так как * имеет приоритет выше, чем +; а выражение a+b-c означает (a+b)-c, поскольку + и - имеют одинаковый приоритет, и операции + и - применяются слева направо .



3.2.1 Скобки

Синтаксис языка С++ перегружен скобками, и разнообразие их применений способно сбить с толку. Они выделяют фактические параметры при вызове функций, имена типов, задающих функции, а также служат для разрешения конфликтов между операциями с одинаковым приоритетом. К счастью, последнее встречается не слишком часто, поскольку приоритеты и порядок применения операций определены так, чтобы выражения вычислялись естественным образом (т.е. наиболее распространенным образом). Например, выражение

if (i<=0 max<i) ...

означает следующее: Если i меньше или равно нулю, или если max меньше i . То есть, оно эквивалентно

if ( (i<=0) (max<i) ) ...

но не эквивалентно допустимому, хотя и бессмысленному выражению

if (i <= (0max) < i) ...

Тем не менее, если программист не уверен в указанных правилах, следует использовать скобки, причем некоторые предпочитают для надежности писать более длинные и менее элегантные выражения, как:

if ( (i<=0) (max<i) ) ...

При усложнении подвыражений скобки используются чаще. Не надо, однако, забывать, что сложные выражения являются источником ошибок. Поэтому, если у вас появится ощущение, что в этом выражении нужны скобки, лучше разбейте его на части и введите дополнительную переменную. Бывают случаи, когда приоритеты операций не приводят к естественному порядку вычислений. Например, в выражении

if (i&mask == 0) ловушка! & применяется после ==

не происходит маскирование i (i&mask), а затем проверка результата на 0. Поскольку у == приоритет выше, чем у &, это выражение эквивалентно i&(mask==0). В этом случае скобки играют важную роль:

if ((i&mask) == 0) ...

Имеет смысл привести еще одно выражение, которое вычисляется совсем не так, как мог бы ожидать неискушенный пользователь:

if (0 <= a <= 99) ...

Оно допустимо, но интерпретируется как (0<=a)<=99, и результат первого сравнения равен или 0, или 1 , но не значению a (если, конечно, a не есть 1 ). Проверить, попадает ли a в диапазон 0...99, можно так:

if (0<=a && a<=99) ...

Среди новичков распространена ошибка, когда в условии вместо == (равно) используют = (присвоить):

if (a = 7) ошибка: присваивание константы в условии ...

Она вполне объяснима, поскольку в большинстве языков = означает равно . Для транслятора не составит труда сообщать об ошибках подобного рода.

3.2.2 Порядок вычислений

Порядок вычисления подвыражений, входящих в выражение, не всегда определен. Например:

int i = 1; v[i] = i++;

Здесь выражение может вычисляться или как v[1 ]=1 , или как v[2]=1 . Если нет ограничений на порядок вычисления подвыражений, то транслятор получает возможность создавать более оптимальный код. Транслятору следовало бы предупреждать о двусмысленных выражениях, но к сожалению



1 ... 21 22 23 [ 24 ] 25 26 27 ... 120

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