Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

// и передаем ее

<< "s: " << s

<< "r: " << r << '\n';

}

Результат выглядит следующим образом:

f(3): Chopin s: Haydn r: Mozart

Временные строки, сгенерированные при вызовах

f(1)
,
f(2)
и
f(3)
, уничтожаются в конце выражения, в котором они были созданы. Однако временная строка, сгенерированная при вызове
f(0)
, связана с переменной
r
и “живет” до конца функции
h
.

A.5. Выражения

В этом разделе описываются операторы языка C++. Мы используем обозначения, которые считаем мнемоническими, например:

m
— для имени члена;
T
для имени типа;
p
— для выражения, создающего указатель;
x
— для выражения;
v
— для выражения
lvalue
;
lst
— для списка аргументов. Типы результатов арифметических операций определяются обычными арифметическими преобразованиями (раздел A.5.2.2). Описания, приведенные в этом разделе, касаются только встроенных операторов, а не операторов, которые программист может определить самостоятельно, хотя, определяя свои собственные операторы, следует придерживаться семантических правил, установленных для встроенных операторов (см. раздел 9.6).

Обратите внимание на то, что члены могут быть сами вложенными, поэтому можем получить такие выражения, как

N::C::m
(см. также раздел 8.7).

Оператор

typeid
и его применения не описаны в этой книге; его детали можно найти в более сложных учебниках. Обратите внимание на то, что операторы приведения не модифицируют свой аргумент. Вместо этого они создают результат своего типа, который каким-то образом соответствует значению аргумента (раздел A.5.7).

Объекты, на которые ссылается указатель

p
в инструкциях
delete p
и
delete[] p
, должны быть размещены в памяти с помощью оператора
new
(раздел A.5.6). Следует подчеркнуть, что выражение
(T)x
является менее конкретным и, следовательно, более уязвимым для ошибок, чем более конкретные операторы приведения (раздел A.5.7).

Эти инструкции в книге не рассматриваются; обратитесь к более сложным учебникам.

Если

y==0
, то результат выражений
x/y
и
x%y
не определен. Если переменная
x
или
y
является отрицательной, то результат выражения
x%y
является отрицательным.

Для встроенных типов операторы

>>
и
<<
означают сдвиг битов (см. раздел 25.5.4). Если левым операндом является объект класса
iostream
, то эти операторы используются для ввода и вывода (см. главы 10-11).

Результатом оператора сравнения является значение типа

bool
.

Обратите внимание на то, что

x!=y
эквивалентно
!(x==y)
. Результат оператора равенства имеет тип
bool
.

Оператор

&
(как и операторы
^
,
|
,
~
,
>>
и
<<
) возвращает комбинацию битов. Например, если переменные
a
и
b
имеют тип
unsigned char
, то результат выражения
a&b
имеет тип
unsigned char
,
в котором каждый бит является результатом применения оператора
&
к соответствующим битам переменных
a
и
b
(раздел A.5.5).

См. раздел А.5.5.

Рассмотрим пример.

template<class T> T& max(T& a, T& b) { return (a>b)?a:b; }

Оператор “знак вопроса” описан в разделе 8.4.

Фраза “аналог

v=v*(x)
” означает, что значение выражения
v*=x
совпадает со значением выражения
v=v*(x)
, за исключением того, что значение v вычисляется только один раз. Например, выражение
v[++i]*=7+3
означает
(++i, v[i]=v[i]*(7+3)
), а не (
v[++i]=v[++i]*(7+3)
) (которое может быть неопределенным; см. раздел 8.6.1).

Результат выражения

throw
имеет тип
void
.

Каждая таблица содержит операторы, имеющие одинаковый приоритет. Операторы в более высоко расположенных таблицах имеют более высокий приоритет по сравнению с операторами, расположенными ниже. Например, выражение

a+b*c
означает
a+(b*c)
, а не
(a+b)*c
, поскольку оператор
*
имеет более высокий приоритет по сравнению с оператором
+
. Аналогично, выражение
*p++
означает
*(p++)
, а не
(*p)++
. Унарные операторы и операторы присваивания являются правоассоциативными (right-associative); все остальные — левоассоциативными. Например, выражение
a=b=c
означает
a=(b=c)
, а выражение
a+b+c
означает
(a+b)+c
.
Lvalue
— это объект, допускающий модификацию. Очевидно, что объект
lvalue
, имеющий спецификатор
const
, защищен от модификации системой типов и имеет адрес. Противоположностью выражения
lvalue
является выражение
rvalue
, т.е. выражение, идентифицирующее нечто, что не может быть модифицировано или не имеет адреса, например, значение, возвращаемое функцией (
&f(x)
— ошибка, поскольку значение, возвращаемое функцией
f(x)
, является значением
rvalue
).

A.5.1. Операторы, определенные пользователем

Правила, перечисленные выше, установлены для встроенных типов. Если же используется оператор, определенный пользователем, то выражение просто преобразовывается в вызов соответствующей операторной функции, определенной пользователем, и порядок действий определяется правилами, установленными для вызова функций. Рассмотрим пример.

class Mine { /* .. . */ };

bool operator==(Mine, Mine);

void f(Mine a, Mine b)

{

if (a==b) { // a==b означает operator==(a,b)

// ...

}

}

Тип, определенный пользователем, — это класс (см. главу 9, раздел A.12) или перечисление (см. разделы 9.5, A.11).

A.5.2. Неявное преобразование типа

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

Поделиться:
Популярные книги

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Все не так, как кажется

Юнина Наталья
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Все не так, как кажется

Безумный Макс. Ротмистр Империи

Ланцов Михаил Алексеевич
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Безумный Макс. Ротмистр Империи

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Лапочки-дочки из прошлого. Исцели мое сердце

Лесневская Вероника
2. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Лапочки-дочки из прошлого. Исцели мое сердце

Сопряжение 9

Астахов Евгений Евгеньевич
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сопряжение 9

Назад в СССР: 1984

Гаусс Максим
1. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Назад в СССР: 1984

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Шипучка для Сухого

Зайцева Мария
Любовные романы:
современные любовные романы
8.29
рейтинг книги
Шипучка для Сухого