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

Временная переменная, связанная с локальной ссылкой, существует столько же, сколько и сама ссылка. Рассмотрим пример.

const char* string_tbl[] = { "Mozart", "Grieg", "Haydn", "Chopin" };

const char* f(int i) { return string_tbl[i]; }

void g(string s){}

void h()

{

  const string& r = f(0);  // связываем временную строку

  // с ссылкой r

  g(f(1));                 // создаем временную строку

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

  string s = f(2);         // инициализируем s временной строкой

  cout << "f(3): " << f(3) // создаем временную строку

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

       << "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).

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

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

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

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

Оператор

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

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

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

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

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

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

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

Если

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

Программирование. Принципы и практика использования C++ Исправленное издание - _353.png
Программирование. Принципы и практика использования C++ Исправленное издание - _354.png

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

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

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

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

bool
.

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

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

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

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

Оператор

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