Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет73/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   69   70   71   72   73   74   75   76   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

3.2 Сводка операций 
Полное и подробное описание операций языка С++ дано в $$R.7. Советуем прочитать этот раздел. 
Здесь же приводится краткая сводка операций и несколько примеров. Каждая операция 
сопровождается одним или несколькими характерными для нее именами и примером ее использования. 


Бьерн Страуструп.
Язык программирования С++ 
 
80 
В этих примерах class_name обозначает имя класса, member - имя члена, object - выражение, задающее 
объект класса, pointer - выражение, задающее указатель, expr - просто выражение, а lvalue (адрес) - 
выражение, обозначающее не являющийся константой объект. Обозначение (type) задает имя типа в 
общем виде (с возможным добавлением *, () и т.д.). Если оно указано без скобок, существуют 
ограничения. 
Порядок применения унарных операций и операций присваивания "справа налево", а всех остальных 
операций - "слева направо". То есть, a=b=c означает a=(b=c), a+b+c означает (a+b)+c, и *p++ означает 
*(p++), а не (*p)++. 


Бьерн Страуструп.
Язык программирования С++ 
 
81 
Операции С++ 
:: 
Разрешение области видимости 
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 
Создание (размещение) 
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 ^ expr 

Поразрядное включающее ИЛИ 
expr | expr 
&& 
Логическое И 
expr && expr 
|| 
Логическое ИЛИ 
expr || expr 
? : 
Операция условия 
expr? expr : expr 

Простое присваивание 
lvalue = expr 
*= 
Присваивание с умножением 
lvalue *= expr 
/= 
Присваивание с делением 
lvalue /= expr 
%= 
Присваивание с взятием остатка от деления 
lvalue %= expr 
+= 
Присваивание со сложением 
lvalue += expr 
-= 
Присваивание с вычитанием 
lvalue -= expr 
<<= 
Присваивание со сдвигом влево 
lvalue <<= expr 


Бьерн Страуструп.
Язык программирования С++ 
 
82 
>>= 
Присваивание со сдвигом вправо 
lvalue >>= expr 
&= 
Присваивание с поразрядным И 
lvalue &= expr 
|= 
Присваивание с поразрядным включающим ИЛИ 
lvalue |= expr 
^= 
Присваивание с поразрядным исключающим ИЛИ 
lvalue ^= expr 

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


Бьерн Страуструп.
Язык программирования С++ 
 
83 
3.2.1 Скобки 
Синтаксис языка С++ перегружен скобками, и разнообразие их применений способно сбить с толку. Они 
выделяют фактические параметры при вызове функций, имена типов, задающих функции, а также 
служат для разрешения конфликтов между операциями с одинаковым приоритетом. К счастью, 
последнее встречается не слишком часто, поскольку приоритеты и порядок применения операций 
определены так, чтобы выражения вычислялись "естественным образом" (т.е. наиболее 
распространенным образом). Например, выражение 
if (i<=0 || maxозначает следующее: "Если i меньше или равно нулю, или если max меньше i". То есть, оно 
эквивалентно 
if ( (i<=0) || (max 
но не эквивалентно допустимому, хотя и бессмысленному выражению 
if (i <= (0||max) < i) // ... 
Тем не менее, если программист не уверен в указанных правилах, следует использовать скобки, причем 
некоторые предпочитают для надежности писать более длинные и менее элегантные выражения, как: 
if ( (i<=0) || (maxПри усложнении подвыражений скобки используются чаще. Не надо, однако, забывать, что сложные 
выражения являются источником ошибок. Поэтому, если у вас появится ощущение, что в этом 
выражении нужны скобки, лучше разбейте его на части и введите дополнительную переменную. 
Бывают случаи, когда приоритеты операций не приводят к "естественному" порядку вычислений. 
Например, в выражении 
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) 
// ошибка: присваивание константы в условии 
// ... 
Она вполне объяснима, поскольку в большинстве языков "=" означает "равно". Для транслятора не 
составит труда сообщать об ошибках подобного рода. 


Достарыңызбен бөлісу:
1   ...   69   70   71   72   73   74   75   76   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет