Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
1UL << 27 // создает значение только с одним установленным битом
// в позиции 27
Первоначально переменная 1UL
имеет 1 в самом младшем бите и по крайней мере 31 нулевой бит. Она определена как unsigned long
, поскольку тип int
гарантированно имеет только 16 битов, а необходимо по крайней мере 27. Это выражение сдвигает 1 на 27 битовых позиций, вставляя в биты позади 0.
К этому значению и значению переменной quiz1
применяется оператор OR. Поскольку необходимо изменить значение самой переменной quiz1
, используем составной оператор присвоения (см. раздел 4.4):
quiz1 |= 1UL << 27; // указать, что ученик номер 27 сдал контрольную
Оператор |=
выполняется аналогично оператору +=
.
quiz1 = quiz1 | 1UL << 27; // эквивалент quiz1 |= 1UL << 21;
Предположим, что учитель пересмотрел контрольные и обнаружил, что ученик 27 фактически списал работу. Теперь учитель должен сбросить бит 27 в 0. На сей раз необходимо целое число, бит 27 которого сброшен, а все остальные установлены в 1. Применение побитового AND к этому значению и значению переменной quiz1
позволяет сбросить только данный бит:
quiz1 &= ~(1UL << 27); // ученик номер 27 не прошел контрольную
Мы получаем значение со всеми установленными битами, кроме бита 27, инвертируя предыдущее значение. У него все биты были сброшены в 0, кроме бита 27, который был установлен в 1. Применение побитового NOT к этому значению сбросит бит 27, а все другие установит. Применение побитового AND к этому значению и значению переменной quiz1
оставит неизменными все биты, кроме бита 27.
И наконец, можно узнать, как дела у ученика 27:
bool status = quiz1 & (1UL << 27); // как дела у ученика 27?
Здесь оператор AND применяется к значению с установленным битом 27 и значением переменной quiz1
. Результат отличен от нуля (т.е. истинен), если бит 27 в значении переменной quiz1
установлен; в противном случае он нулевой.

Хотя многие программисты никогда не используют побитовые операторы непосредственно, почти все они использует их перегруженные версии в виде операторов ввода и вывода. Перегруженный оператор имеет тот же приоритет и порядок, что и его встроенная версия. Поэтому программисты должны иметь понятие о приоритете и порядке операторов сдвига, даже если они никогда не используют их встроенные версии.
Поскольку операторы сдвига имеют левосторонний порядок, выражение
cout << "hi" << " there" << endl;
выполняется так:
( (cout << "hi") << " there" ) << endl;
В этом операторе операнд "hi"
группируется с первым символом <<
. Его результат группируется со вторым, а его результат с третьим символом.
Приоритет операторов сдвига средний: ниже, чем у арифметических операторов, но выше, чем у операторов отношения, присвоения и условных операторов. Эти различия в уровнях приоритета свидетельствуют о том, что для правильной группировки операторов с более низким приоритетом следует использовать круглые скобки.
cout << 42 + 10; // ok: приоритет + выше, поэтому выводится сумма
cout << (10 < 42); // ok: группировку определяют скобки; выводится 1
cout << 10 < 42; // ошибка: попытка сравнить cout с 42!
Последний оператор cout
интерпретируется так
(cout << 10) < 42;
Он гласит: "записать 10 в поток cout
, а затем сравнить результат (т.е. поток cout
) со значением 42
".
Упражнение 4.25. Каково значение выражения ~'q' << 6
на машине с 32-битовыми целыми числами и 8-битовыми символами, с учетом, что символ 'q'
имеет битовое представление 01110001
?
Упражнение 4.26. Что будет, если в приведенном выше примере оценки учеников использовать для переменной quiz1
тип unsigned int
?
Упражнение 4.27. Каков результат каждого из этих выражений?
unsigned long ul1 = 3, ul2 = 7;
(a) ul1 & ul2 (b) ul1 | ul2
(c) ul1 && ul2 (d) ul1 || ul2
4.9. Оператор sizeof
Оператор sizeof
возвращает размер в байтах результата выражения или указанного по имени типа. Оператор имеет правосторонний порядок. Результат оператора sizeof
— это константное выражение (см. раздел 2.4.4) типа size_t
(см. раздел 3.5.2). Оператор существует в двух формах.
sizeof( тип )
sizeof выражение
Во второй форме оператор sizeof
возвращает размер типа, возвращаемого выражением. Оператор sizeof
необычен тем, что он не выполняет свой операнд.
Sales_data data, *p;
sizeof(Sales_data); // размер, необходимый для хранения объекта
// типа Sales_item
sizeof data; // размер типа данных, аналог sizeof(Sales_data)
sizeof p; // размер указателя
sizeof *p; // размер типа, на который указывает указатель p,
// т.е. sizeof(Sales_data)
sizeof data.revenue; // размер типа члена revenue класса Sales_data
sizeof Sales_data::revenue; // альтернативный способ получения
// размера revenue
Наиболее интересен пример sizeof *p
. Во-первых, поскольку оператор sizeof
имеет правосторонний порядок и тот же приоритет, что и оператор *
, это выражение группируется справа налево. Таким образом, оно эквивалентно выражению sizeof(*p)
. Во-вторых, поскольку оператор sizeof
не выполняет свой операнд, не имеет значения, допустим ли указатель p
(т.е. инициализирован ли он) (см. раздел 2.3.2). Обращения к значению недопустимого указателя оператор sizeof
не осуществляет, и указатель фактически не используется, поэтому он безопасен. Ему и не нужно обращаться к значению указателя, чтобы выяснить, какой тип он возвратит.
По новому стандарту для доступа к члену класса при получении его размера можно использовать оператор области видимости. Обычно к членам класса можно обратиться только через объект этого класса. Больше не обязательно предоставлять объект, так как оператор
sizeof
не обязан выбирать член класса, чтобы узнать его размер.
Результат применения оператора sizeof
частично зависит от типа, к которому он применен.
• Если это тип char
или выражения, результат которого имеет тип char
, то это гарантированно будет 1
.
• Если это ссылка, то возвращает размер типа объекта, на который она ссылается.
• Если это указатель, то возвращается размер, необходимый для хранения указателя.
• Если это обращение к значению указателя, то возвращается размер типа объекта, на который он указывает, вне зависимости от его допустимости.
Читать дальшеИнтервал:
Закладка: