Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Оператор логического NOT ( !) возвращает инверсию исходного значения своего операнда. Этот оператор уже использовался в разделе 3.2.2. В следующем примере подразумевается, что vec— это вектор целых чисел, для проверки наличия значений в элементах которого используется оператор логического NOT для значения, возвращенного функцией empty().
// отобразить первый элемент вектора vec, если он есть
if (!vec.empty())
cout << vec[0];
Подвыражение !vec.empty()возвращает значение true, если вызов функции empty()возвращает значение false.
Операторы отношения ( <, <=, >, <=) имеют свой обычный смысл и возвращают значение типа bool. Эти операторы имеют левосторонний порядок.
Поскольку операторы отношения возвращают логическое значение, их сцепление может дать удивительный результат:
// Упс! это условие сравнивает k с результатом сравнения i < j
if (i < j < k) // true, если k больше 1!
Условие группирует iи jв первый оператор <. Результат этого выражения (типа bool) является левым операндом второго оператора <. Таким образом, переменная kсравнивается с результатом ( trueили false) первого оператора сравнения! Для реализации той проверки, которая и предполагалась, выражение нужно переписать следующим образом:
// условие истинно, если i меньше, чем j, и j меньше, чем k
if (i < j && j < k) { /* ... */ }
Если необходимо проверить истинность арифметического значения или объекта указателя, то самый простой способ подразумевает использование этого значения как условия.
if (val) { /* ... */ } // true, если val - любое не нулевое значение
if (!val) { /* ... */ } // true, если val - нуль
В обоих условиях компилятор преобразовывает valв тип bool. Первое условие истинно, пока значение переменной valотлично от нуля; второе истинно, если val— нуль.
Казалось бы, условие можно переписать так:
if (val == true) { /* ... */ } // true, только если val равно 1!
У этого подхода две проблемы. Прежде всего, он длинней и менее непосредствен, чем предыдущий код (хотя по общему признанию в начале изучения языка С++ этот код понятней). Но важней всего то, что если тип переменной valотличен от bool, то это сравнение работает не так, как ожидалось.
Если переменная valимеет тип, отличный от bool, то перед применением оператора ==значение trueпреобразуется в тип переменной val. Таким образом, получается код, аналогичный следующему:
if (val == 1) { /*...*/ }
Как уже упоминалось, при преобразовании значения типа boolв другой арифметический тип falseпреобразуется в 0, a true— в 1(см. раздел 2.1.2). Если бы нужно было действительно сравнить значение переменной valсо значением 1, то условие так и следовало бы написать.
Использование логических литералов trueи falseв качестве операндов сравнения — обычно плохая идея. Эти литералы следует использовать только для сравнения с объектами типа bool.
Упражнение 4.8. Объясните, когда обрабатываются операнды операторов логического AND, логического OR и оператора равенства.
Упражнение 4.9. Объясните поведение следующего условия оператора if:
const char *cp = "Hello World";
if (cp && *cp)
Упражнение 4.10. Напишите условие цикла while, который читал бы целые числа со стандартного устройства ввода, пока во вводе не встретится значение 42.
Упражнение 4.11. Напишите выражение, проверяющее четыре значения а, b, си dи являющееся истинным, если значение абольше b, которое больше c, которое больше d.
Упражнение 4.12. С учетом того, что i, jи kимеют тип int, объясните значение выражения i != j < k.
4.4. Операторы присвоения
Левым операндом оператора присвоения должно быть допускающее изменение l-значение. Ниже приведено несколько примеров недопустимых попыток присвоения.
int i = 0, j = 0, k = 0; // инициализация, а не присвоение
const int ci = i; // инициализация, а не присвоение
1024 = k; // ошибка: литерал является r-значением
i + j = k; // ошибка: арифметическое выражение - тоже r-значение
ci = k; // ошибка: ci - константа (неизменяемое l-значение)
Результат присвоения, левый операнд, является l-значением. Тип результата совпадает с типом левого операнда. Если типы левого и правого операндов отличаются, тип правого операнда преобразуется в тип левого.
k = 0; // результат: тип int, значение 0
k = 3.14159; // результат: тип int, значение 3
По новому стандарту с правой стороны можно использовать список инициализации (см. раздел 2.2.1):
k = {3.14}; // ошибка: сужающее преобразование
vector vi; // первоначально пусто
vi = {0,1,2,3,4,5,6,7,8,9}; // теперь vi содержит десять элементов
// со значениями от 0 до 9
Если левый операнд имеет встроенный тип, список инициализации может содержать максимум одно значение, и это значение не должно требовать сужающего преобразования (narrowing conversion) (см. раздел 2.2.1).
Для типов классов происходящее зависит от подробностей класса. В случае вектора шаблон vectorопределяет собственную версию оператора присвоения, позволяющего использовать список инициализации. Этот оператор заменяет элементы вектора с левой стороны элементами списка с правой.
Независимо от типа левого операнда список инициализации может быть пуст. В данном случае компилятор создает инициализированный значением по умолчанию (см. раздел 3.3.1) временный объект и присваивает это значение левому операнду.
В отличие от других парных операторов, присвоение имеет правосторонний порядок:
int ival, jval;
ival = jval = 0; // ok: каждой переменной присвоено значение 0
Поскольку присвоение имеет правосторонний порядок, его крайняя правая часть, jval = 0, является правым операндом крайнего левого оператора присвоения. Поскольку присвоение возвращает свой левый операнд, результат крайнего правого присвоения (т.е. jval) присваивается переменной ival.
Интервал:
Закладка: