Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
occurs = 1;
(c) if (int ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0\n";
(d) if (ival = 0)
ival = get_value();
Упражнение 5.8. Что такое "потерянный оператор else
"? Как в языке С++ определяется принадлежность ветви else
?
5.3.2. Оператор switch
Оператор switch
предоставляет более удобный способ выбора одной из множества альтернатив. Предположим, например, что необходимо рассчитать, как часто встречается каждая из пяти гласных в некотором фрагменте текста. Программа будет иметь следующую логику.
• Читать каждый введенный символ.
• Сравнить каждый символ с набором искомых гласных.
• Если символ соответствует одной из гласных букв, добавить 1
к соответствующему счетчику.
• Отобразить результаты.
Программа должна отобразить результаты в следующем виде:
Number of vowel а: 3195
Number of vowel e: 6230
Number of vowel i: 3102
Number of vowel o: 3289
Number of vowel u: 1033
Для непосредственного решения этой задачи можно использовать оператор switch
.
// инициализировать счетчики для каждой гласной
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while (cin >> ch) {
// если ch - гласная, увеличить соответствующий счетчик
switch (ch) {
case 'a':
++aCnt;
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
}
}
// вывод результата
cout << "Number of vowel a: \t" << aCnt << '\n'
<< "Number of vowel e: \t" << eCnt << '\n'
<< "Number of vowel i: \t" << iCnt << '\n'
<< "Number of vowel o: \t" << oCnt << '\n'
<< "Number of vowel u: \t" << uCnt << endl;
Оператор switch
вычисляет результат выражения, расположенного за ключевым словом switch
. Это выражение может быть объявлением инициализированной переменной (см. раздел 5.2). Выражение преобразуется в целочисленный тип. Результат выражения сравнивается со значением, ассоциированным с каждым оператором case
.
Если результат выражения соответствует значению метки case
, выполнение кода начинается с первого оператора после этой метки. В принципе выполнение кода продолжается до конца оператора switch
, но оно может быть прервано оператором break
.
Более подробно оператор break
рассматривается в разделе 5.5.1, а пока достаточно знать, что он прерывает текущий поток выполнения. В данном случае оператор break
передает управление первому оператору после оператора switch
. Здесь оператор switch
является единственным оператором в теле цикла while
, поэтому его прерывание возвращает контроль окружающему оператору while
. Поскольку в нем нет никаких других операторов, цикл while
продолжается, если его условие выполняется.
Если соответствия не найдено, выполнение сразу переходит к первому оператору после switch
. Как уже упоминалось, в этом примере выход из оператора switch
передает управление условию цикла while
.
Ключевое слово case и связанное с ним значение называют также меткой case
( case
label). Значением каждой метки case
является константное выражение (см. раздел 2.4.4).
char ch = getVal();
int ival = 42;
switch(ch) {
case 3.14: // ошибка: метка case не целое число
case ival: // ошибка: метка case не константа
// ...
Одинаковые значения меток case
недопустимы. Существует также специальная метка default
, рассматриваемая ниже.
switch
Важно понимать, как управление передается между метками case
. После обнаружения соответствующей метки case
выполнение начинается с нее и продолжается далее через все остальные метки до конца или пока выполнение не будет прервано явно. Во избежание выполнения последующих разделов case
выполнение следует прервать явно, поэтому оператор break
обычно является последним оператором перед следующей меткой case
.
Однако возможны ситуации, когда необходимо именно стандартное поведение оператора switch
. У каждой метки case
может быть только одно значение, однако две или более метки могут совместно использовать единый набор действий. В таких ситуациях достаточно пропустить оператор break
и позволить программе пройти несколько меток case
.
Например, можно было бы посчитать общее количество гласных так:
unsigned vowelCnt = 0;
// ...
switch (ch) {
// для инкремента vowelCnt подойдет любая буква а, е, i, о или u
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
++vowelCnt;
break;
}
Здесь расположено несколько меток case
подряд без оператора break
. Теперь при любой гласной в переменной ch
будет выполняться тот же код.
Поскольку язык С++ не требует обязательно располагать метки case
в отдельной строке, весь диапазон значений можно указать в одной строке:
switch (ch) {
// альтернативный допустимый синтаксис
case 'a': case 'e': case 'i': case 'o': case 'u':
++vowelCnt;
break;
}
Случаи, когда оператор
break
пропускают преднамеренно, довольно редки, поэтому их следует обязательно комментировать, объясняя логику действий.
break
— весьма распространенная ошибкаВесьма распространено заблуждение, что выполняются только те операторы, которые связаны с совпавшей меткой case
. Вот пример неправильной реализации подсчета гласных в операторе switch
:
// внимание: преднамеренно неправильный код!
switch (ch) {
case 'a' :
++aCnt; // Упс! Необходим оператор break
case 'e':
++eCnt; // Упс! Необходим оператор break
case 'i':
++iCnt; // Упс! Необходим оператор break
case 'o':
++oCnt; // Упс! Необходим оператор break
case 'u':
++uCnt;
}
Чтобы понять происходящее, предположим, что значением переменной ch
является 'e'
. Выполнение переходит к коду после метки case 'e'
, где происходит инкремент переменной eCnt
. Выполнение продолжается далее через метки case
, увеличивая также значения переменных iCnt
, oCnt
и uCnt
.
Несмотря на то что оператор
break
и не обязателен после последней метки оператора switch
, использовать его все же рекомендуется. Ведь если впоследствии оператор switch
будет дополнен еще одной меткой case
, отсутствие оператора break
после прежней последней метки не создаст проблем.
Интервал:
Закладка: