Главная страница
Навигация по странице:

  • Препроцессор

  • Компилятор

  • Профилировщики

  • Лекция. Лекция 1. Программа написанная на языке C как и на многих других языках программирования высокого уровня переводится компьютером в язык самого низкого уровня на машинный язык.


    Скачать 147.46 Kb.
    НазваниеПрограмма написанная на языке C как и на многих других языках программирования высокого уровня переводится компьютером в язык самого низкого уровня на машинный язык.
    АнкорЛекция
    Дата03.01.2022
    Размер147.46 Kb.
    Формат файлаdocx
    Имя файлаЛекция 1.docx
    ТипПрограмма
    #323374


    Одно из положительных качеств языка С++ связано с его универсальностью. Один и тот же исходный код C ++ может быть скомпилирован под различные платформы, например, Linux, Windows и выполняться процессорами различной архитектуры.

    Программа написанная на языке C++ как и на многих других языках программирования высокого уровня переводится компьютером в язык самого низкого уровня  на машинный язык. Средство, осуществляющее перевод программы с языка С++ на машинный язык называется компилятором. В процессе компиляции осуществляется также проверка синтаксиса каждой строки вашей программы, оптимизация программного кода и многое другое.

    Процесс создания программы представлен на рисунке 1.1

    Помимо компилятора для написания программы на языке С++ требуется текстовой редактор и другие компоненты, представленные на рисунке 1.1 Рассмотрим их назначение.










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

    Компилятор  переводит исходный код C ++ в машинный код.

    Компоновщик  объединяет сгенерированный компилятором машинный код с предварительно скомпилированным библиотечным кодом для создания полноценной исполняемой программы.

    Скомпилированный код программиста не способен работать сам по себе и нуждается в дополнительном машинном коде для создания полноценной исполняемой программы.

    Отсутствующий машинный код был предварительно скомпилирован и сохранен в хранилище кода, называемого библиотекой. Программа под названием компоновщик объединяет скомпилированный код программиста и код библиотеки для создания полной программы.

    Отладчик. Отладчик позволяет программисту:

    • запустить программу и посмотреть, какая строка в исходном коде отвечает за текущие действия,

    • отслеживать выполнение программы по порядку,

    • найти и исправить ошибки в реализации программы.

    Программист может получить значения переменных, чтобы сравнить их с ожидаемыми. Отладчики полезны для поиска ошибок.

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

    Профилировщик показывает:

    • сколько раз часть программы выполняется во время определенного запуска,

    • сколько времени занимает выполнение этой части.

    Основная цель профилирования  найти части программы, которые можно улучшить, чтобы ускорить работу программы.

    Если текстовой редактор поддерживает цветовое выделение ошибок, подсветку операторов языка С++, подсказки и другое, то это сильно упрощает написание программ.

    Редактор со всеми подключенными к нему этими возможностями, компилятором, справочными материалами, а также приведенными выше компонентами называется интегрируемые средой разработки IDE (Integrated Development Environment).

    Таким образом, IDE своего рода набор инструментальных средств для построения, запуска и отладки программ. IDE имеет очень большой набор возможности, который описывается в документации, некоторые из которых используются только в редких случаях при разработке сложных программных продуктов.

    Существуют различные IDE для изучения С++ и профессионального программирования, например, Visual Studio C++ и другие.

    IDE могут различаться между собой своими функциональными возможностями, интерфейсом, поддерживаемой операционной системой. Но основные возможности, необходимые для разработки программ на С++ и изучения программирования есть у всех.

    Одним из простейших и бесплатных IDE является Code::blocks [ ].

    Для работы с этим IDE необходимо скачать дистрибутив «codeblocks-17.12mingw-setup.exe»1 в разделе Downloads сайта [ ] под Windows или другую версию дистрибутива под Linux.

    После установки этого дистрибутива и запуска. В меню «File» -> «Empty file» создадим файл и введем текст простейшей программы, как показано на рисунке 1.2.


    Рисунок 1.2. Запуск IDE и ввод программы
    Сохраняем файл под именем “first.cpp”, как показано на рисунке 1.3. Далее с помощью команды «Build and run» меню «Build» (клавиша F9) запускаем программу. Результаты, представлены на рисунке 1.4.


    Рисунок 1.3. Сохранение файла.



    Рисунок 1.4. Результаты программы.

    В конце программы включают также оператор system("pause") для того, чтобы окно консольного приложения не закрывалось сразу после запуска программы.

    Если в процессе написания программы были допущены ошибки, то после компиляции в нижней части IDE появятся сообщения о допущенных ошибках, кодах этих ошибок. Выбрав любое из этих сообщений в нижней части окно IDE сделает переход курсора на строку, содержащую выбранную ошибку.


    Структура программы на С++


    Составляя программы, часто требуется использовать те или иные функции, например, clrscr(), getch(), которые помогают программистам реализовать ввод вывод данных в консоль. Эти функции входят в состав стандартной библиотеки. Существует множество стандартных библиотек C++. Применение этих библиотек упрощает процесс разработки программы за счёт того, что программистам не требуется каждый раз реализовывать стандартные функции ввода-вывода, уменьшает объем кода, делает программу более простой для понимания. Существует стандартные библиотеки для решения множества задач и разработка более или менее сложной программы практически невозможна без использования этих библиотек.

    Для того чтобы подключить библиотеку в начале пишется символ # далее ключевое слово include имя нашей библиотеки, заключённое в угловые скобки, например,

    #include

    Эта строка является директивой предварительной обработки. Все директивы предварительной обработки в исходном коде C ++ начинаются с символа #. Эта директива указывает препроцессору добавить некоторый предопределенный исходный код в существующий до того, как компилятор начнет его обрабатывать. Этот процесс выполняется автоматически и невидим для нас.

    Библиотека iostream содержит элементы, которые реализуют ввод и вывод (печать на дисплей, ввода с клавиатуры и работа с файлами).

    Чтобы какой-либо текст внутри программы воспринимался IDE, как текст для пояснения программы, а не, как код, для выполнения, существует комментарии.

    В языке C++ комментарий в одной строке создаётся с помощью символа // (двойной слеш). Всё, что находится справа от этого символа в строке, считается комментарием. Такой вид комментариев называется однострочным комментарием, например,

    // Author

    Многострочный комментарий создаётся с помощью символа звездочка с косой чертой. Здесь возможно прокомментировать много строк одновременно. Комментарии заканчивается символом звездочка с обратной косой чертой, например,

    /*

    Version 1.0

    Date 17/12/2018

    */

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

    Следующее важная часть любой программы на С++  это функция main().

    Эта специальная функция, обязательная для любой программы, внутри которой содержится код программы. Выполнение каждой программы начинается с этой функций. Внутри круглых скобок функции указывается объявления параметров. Более подробно описание об этом и о функциях в общем содержится в параграфе, посвященным функциям.

    Начало функции задаётся символом открывающейся фигурной скобки “{”, а конец функции  закрывающейся фигурной скобкой “}”. Всё, что находится между этими фигурными скобками, называется телом функции. После запуска программы выполняются инструкции из этой функции, начиная с первой инструкции после открывающейся фигурной скобки.

    Вывода текста на экране компьютера осуществляется с помощью оператора cout, например, cout << "Hello \n ". Текст, заключенный в кавычки «Hello \n» называется строкой или строкой символов. Строки заключаются в кавычки ("). Символы << обозначает направление вывода. По умолчанию направлением вывода является экран компьютера. Строка «Hello \n» содержит символ «\n». Это известно, как escape-последовательность символов. Это означает, что вывод в этой строке завершен, и любой последующий вывод должен произойти на следующей строке. Вывод строки cout << "Hello \n " можно записать и в виде cout << "Hello" << endl.

    В конце каждого оператора добавляется точка с запятой. Точка запятой позволяет компилятору различать конец одного и начало другого оператора. Любое количество пробелов между операторами или запись несколько операторов в одной строке допускается компилятором. Однако, чтобы программа была более понятной желательно придерживаться определенный правил оформления программного кода, например, каждый оператор записывать в отдельной строке.

    Итак, текст нашей простейшей программы представлен ниже:

    #include

    main()

    {

    cout <<"Hello \ n ";

    }

    Если скомпилировать эту программу, то возникнет ошибка « 'cout' was not declared in this scope».

    Имена функции стандартной библиотеки должны принадлежать пространству имен. Пространство имен  это некоторая область внутри которой определяются различного рода идентификаторы (переменные, функции, типы и др). Пространство имен используется для избегания конфликтов имен, когда в программе используется несколько библиотек в которых определены, переменные с одним и тем же именем.

    Для исправления этой ошибки необходимо указать для cout пространство имен. Сout принадлежит пространству имен std (от слова standart). Пространство имен указывается с помощью пары символов двоеточия, как приведено ниже:

    #include

    main()

    {

    std::cout <<" Hello \ n ";

    }

    Указывать пространство имен перед каждым вызовом функции ввода-вывода неудобно и в целях сокращения записи кода используется конструкция using namespace после директивы #include.

    #include

    using namespace std;

    main()

    {

    cout <<" Hello \ n ";

    }

    Переменные, объявление переменных, типы переменных


    С++ поддерживает работу с целыми числами. Целые числа выводятся также как и строки только без кавычек с помощью конструкции cout, например,

    cout <<4;

    После вывода этого числа оно нигде не сохраняется и не изменяется. Если требуется сохранить число в памяти компьютера, то требуется переменные, т.е. переменные – это некоторый контейнер для хранения числовых или нечисловых значений.

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

    представлять значения, отличные от чисел. В следующем листинге переменная используется для хранения целочисленного значения и затем вывода на экран значения.

    #include

    using namespace std;

    int main() {

    int x;

    x = 10;

    cout << x << '\n';

    }

    Каждая переменная имеет своё уникальное имя в пределах области определения переменной и тип переменной, который определяет какого типа значения хранятся в переменной, например, целые числа, строки и.т.д.

    В листинге выражение int x означает объявление переменной с именем x и типой int (целые числа). Все переменные в программе на C ++ должны быть объявлены. Объявление указывает тип переменной и имя переменной.

    Формат объявления переменной имеет следующий вид:

    <имя типа> <имя переменной> { = <начальное значение> }2

    С++ поддерживает различные типы целых чисел, ограниченные по своему диапазону [ ].

    Выражение x = 10 .Это оператор присваивания. Оператор присваивания связывает значение с переменной. Символ = в этом выражении обозначает оператор присваивания. Здесь значение 10 присваивается переменной x. Это означает, что значение 10 будет сохранено в памяти. Нам не нужно беспокоиться о том, где переменная хранится в памяти. Компилятор позаботится об этом сам и выделит 4 байта для хранения переменной xтипа int.

    Место хранения переменной в памяти называется её адресом. Для получения адреса хранения переменной используется конструкция &<имя переменной>, например,

    cout << &x

    выведет адрес переменной x.

    Процесс присвоения значения переменной называется инициализацией. После объявления переменной допускается присваивание любое количество раз.

    Значение, присваиваемой переменной должно принадлежать допустимому диапазону типа этой переменной, например, для переменной типа int такое присвоение приведет к ошибке.

    x = 15837485738457834750;

    С++ допускает объявление нескольких переменных одного типа и инициализацию части из них, например:

    inta = 40, b, c = 20;

    В этом примере значение переменной b не определено.

    Имя переменной называют также ее идентификатором. При составлении программ рекомендуется использовать осмысленные имена переменных, например, altitude, sum и user_name, вместо a, s и u, чтобы программа была более читабельной.

    C ++ имеет строгие правила для идентификаторов переменных:

        • идентификаторы должны содержать хотя бы один символ;

        • первый символ должен быть буквой алфавита (в верхнем или нижнем регистре) или подчеркиванием.

    Иногда перед именем переменной указывает префикс, обозначающий тип переменной, например, префикс s – обозначает строку, i – целое число и.т.д. Например, имя sClientName показывает нам, что тип этой переменной строка. Такой способ именования переменных называют венгерской нотацией [ ].

    C++ поддерживает несколько целочисленных типов. Тип short int, который может быть записан, как short, представляет собой целые числа, которые могут занимать меньше байтов памяти, чем тип int. Если тип short занимает меньше памяти, он обязательно должен представлять меньший диапазон целочисленных значений, чем тип int. C++ стандарт не требует, чтобы тип short был меньше типа int, на самом деле, они могут представлять тот же набор целочисленных значений.

    Тип long int, который может быть записан как long, может занимать больше байт для хранения в памяти, чем тип int и, таким образом, сможет представлять больший диапазон значений.

    Наконец, тип long long int может занимать больше байт чем long Стандарт C ++ гарантирует следующие относительные диапазоны значений этих типов:

    short int <= int <= long int <= long long int

    C ++ предоставляет целочисленные типы, исключающие отрицательные числа, которые приведены в таблице 1. Эти типы включают слово без знака в их именах, что означает, что они не допускают отрицательный знак.

    unsigned short <= unsigned <= unsigned long <= unsigned long long

    Таблица 1.1. Целочисленные типы C++

    Имя типа

    Короткое название

    Кол. байт

    Минимальное значение

    Максимальное значение

    short int

    short

    2

    -32 768

    32 768

    int

    int

    4

    -2 147 483 648

    2 147 483 647

    long int

    long

    4

    -2 147 483 648

    2 147 483 647

    long long int

    long long

    8

    -9 223 372 036 854 775 808

    9 223 372 036 854 775 807

    unsigned short

    unsigned short

    2

    0

    65 535

    unsigned int

    unsigned

    4

    0

    4 294 967 295

    unsigned long int

    unsigned long

    4

    0

    4 294 967 295

    unsigned long long int

    unsigned long long

    8

    0

    18 446 744 073 709 551 615

    Для многих вычислительных задач требуются дробные числа. C ++ поддерживает такие нецелые числа, и они называются числами с плавающей точкой. Имя происходит из того, что во время математических вычислений десятичная точка может перемещаться или «плавать».

    Существуют различные типы чисел с плавающей точкой. Тип double используется чаще, так как он расшифровывается как «с плавающей точкой двойной точности», и может представлять более широкий диапазон значений с и с большей точностью. Переменные типа double следует использовать для вычислений, где требуется высокая точность.

    Тип float представляет значения с плавающей точкой одинарной точности, которые являются менее точными, как показано в таблице 2

    Таблица 2. Характеристики чисел с плавающей точкой на 32-х разрядных процессорах

    Имя типа

    Кол. байт

    Минимальное положительное значение

    Максимальное значение

    float

    4

    1,17549×10-38

    3,40282×1038

    double

    4

    2,22507×10-308

    1,79769×10308

    long double

    8

    2,22507×10-308

    1,79769×10308

    Пример создания двух переменных типа с плавающей точкой представлен ниже. В выражении для переменной s2 символ f означает, что число следует представлять, как число с плавающей точкой одинарной точности.

    float s2 = 5.13f;

    double s3 = 5.13;

    Тип данных char используется для представления отдельных символов: букв алфавита (как верхнего, так и нижнего регистра), цифры, знаки пунктуации и управляющие символы (например, символы новой строки и символы табуляции). Большинство систем поддерживают набор символов Американского стандартного кода для обмена информацией (ASCII). Стандарт ASCII может представлять 128 символов.

    В C ++ символы заключаются в одинарные кавычки ('), как в примере

    char ch = 'A';

    Стандартные (двойные) кавычки (") зарезервированы для строк и не допускаются для символов.

    В памяти переменные типа char хранятся в виде целочисленных значений, и C++ позволяет присваивать числовые значения символьным переменным и присвоение символов числовым переменным и такая запись равносильна предыдущей.

    ch = 65; // 65 – ASCII код буквы A

    Строка  это последовательность символов, наиболее часто используемая для представления слов и имен.

    Строка должна быть заключена в двойные кавычки, например,

    strings = “Helloworld”;

    C ++ поддерживает нечисловой тип данных bool, который является очень простым и может представлять только два значения: истина или ложь. Этот тип данных часто используется в оценке значений логических выражений в условных операторах и в других случаях.

    bool t = true;

    bool t = 123;

    В последнем выражении 0 – это всегда false, ненулевое значение эквивалентно true.

    C ++ поддерживает именованные константы. Константы объявляются, как переменные с добавлением ключевого слова const:

    constdoublePI = 3.14159;

    После объявления и инициализации константа может использоваться, как переменная во всех отношениях, кроме одного – константе нельзя повторно присвоить значение. Недопустимо, чтобы константа появлялась слева от оператора присваивания (=).

    const string programAuthor = “Ivanov Anton”;

    Локальные переменные – это переменные, которые определяются внутри функции и используются только внутри функции . В языке С++ локальные переменные можно определять внутри блока программы.

    Блок программы – это набор директив (в том числе и описание переменных), которые заключены в фигурные скобки.

    Локальные переменные имеют некоторые очень желательные свойства:

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

    Иногда желательно иметь переменную, которая живет до тех пор, пока работает программа; то есть, пока основная функция не завершится.

    В отличие от локальной переменной, глобальная переменная объявляется вне всех функций и не является локальной для каких-либо конкретных функций.

    void main()

    {



    // 1-йблок.

    {

    int x, y, z;

    ...

    }

    // 2-йблок.

    {

    int x, y, z;

    ...

    }

    }

    Переменные x, y, z первого блока никак не связаны с переменными x, y, z второго блока. Параметры, которые перечисляются в заголовке функции, относятся к локальным переменным.

    Глобальные переменные – это те переменные, которые объявляются вне функции (перед заголовком функции или блока программы). Глобальные переменные можно использовать в любой директиве, независимо от того, в какой функции или в каком блоке эта директива используется.

    #include"stdafx.h"

    #include
    int x; // глобальная переменная x
    void doSomething()

    {

    // Глобальные переменные можно использовать в любом месте программы

    x = 4;

    }
    int _tmain(int argc, _TCHAR* argv[])

    {

    doSomething();

    x = 7;

    std::cout << x << "\n";

    return 0;

    }

    Переменные во внутреннем блоке скрывают переменные с теми же именами во внешнем блоке, локальные переменные скрывают глобальные переменные с одинаковыми именами внутри блока, в котором они определены. Однако, с помощью оператора разрешения области видимости (::), компилятору можно сообщить, какую версию переменной вы хотите использовать: глобальную или локальную.

    #include"stdafx.h"

    #include
    int x = 4; // глобальнаяпеременная

    int _tmain(int argc, _TCHAR* argv[])

    {

    int x = 8; // эта переменная (локальная) скрывает значение глобальной переменной

    x++; // увеличивается локальная переменная value, не глобальная

    ::x--; // уменьшается глобальная переменная value, не локальная

    std::cout << "Global value: " << ::x << "\n";

    std::cout << "Local value: " << x << "\n";

    return 0;

    }
    Результат работы программы:
    Global value: 3

    Local value: 9

    Однако, не рекомендуется использовать одинаковые имена для локальных и глобальных переменных, т.к. возможны проблемы и ошибки.


    Статические переменные


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

    Поскольку локальные переменные являются временными, функция не может сохранять какую-либо информацию между вызовами. C ++ обеспечивает способ, которым локальная переменная в функции, может быть сохранена между вызовами.

    Листинг показывает, как объявление статической локальной переменной позволяет ей оставаться в памяти на время выполнения программы.

    #include

    #include

    int count() {

    // переменная cnt's сохраняется между вызовами, так как объявлена

    // как статическая

    staticintcnt = 0;

    return ++cnt; // Увеличение и возврат текущего значения count

    }

    int main()

    {

    // Подсчетдо 10

    for (int i = 0; i < 10; i++)

    std::cout << count() << ' ';

    std::cout << '\n';

    }

    Функция count() вызывается 10 раз. Каждый раз, при вызове статическая переменная cntувеличивается. В результате выводится ряд:

    1 2 3 4 5 6 7 8 9 10

    Если удалить слово static из листинга перекомпилировать его и запустите снова, то получим:

    1 1 1 1 1 1 1 1 1 1

    Так как новая память выделяется для переменной cnt каждый раз, когда вызывается функция.

    Локальное объявление переменной static int cnt = 0;

    выделяет место для cnt и присваивает ему ноль один раз - в начале выполнения программы. Память для переменной cnt не освобождается, пока программа не закончит свое выполнение.

    Операторы для консольного ввода/вывода


    В С++ существует библиотека ввода-вывода iostream, использующая концепцию объектно-ориентированного программирования:

    #include

    сin  это объект входного потока пространства имен std: std::cin >> x; В данном коде программы используется оператор cin, операция взятия из потока >> чтобы получить от пользователя введенное им значение. Объект std::cin забирает вводимую пользователем информацию из стандартного потока ввода, который обычно является клавиатура.

    Объект std::cout выводит информацию в стандартный поток вывода, который обычно является экран. Оператор cout помещает в поток <<, чтобы вывести на экран пользователю определенную информацию.

    Библиотека iostream определяет три стандартных потока:

    cin стандартный входной поток (stdin в С)

    cout стандартный выходной поток (stdout в С)

    cerr стандартный поток вывода сообщений об ошибках (stderr в С)

    Для сокращения записи необходимо подключить имен

    using namespace std;

    Напишем программу, которая находит сумму двух целых чисел и выводит результат на экран.

    #include

    using namespace std;

    voidmain ()

    {

    int x,y; //объявляем переменный целого типа

    cin>>x; //вводим с клавиатуры первое число

    cin>>y; //вводим с клавиатуры второе число

    cout<<"x+y= "<

    }

    Символ '\n' служит для перевода курсора на новую строку.

    Фрагмент кода

    std :: cin >> x;

    std :: cout << x;

    может быть записан в явном виде:

    cin.operator>>(x);

    cout.operator<<(x);

    Первый оператор вызывает метод operator >> от имени объекта std :: cin, передающего переменную х по ссылке. Второе выражение вызывает метод оператора << от имени объекта std :: cout передавая значение переменной х.

    В следующем листинге программа работает нормально, пока пользователь вводит целочисленное значение. Что делать, если пользователь

    вводит слово «five» вместо целого числа? Программа выдаст неверные результаты. Можно использовать некоторые дополнительные методы, доступные для объекта std :: cin, для создания более надежной программы.

    Следующая программа обнаруживает недопустимый ввод и продолжает вводить, пока пользователь не предоставит приемлемое значение.

    #include

    #include

    int main() {

    int x;

    std::cout << "Please enter an integer: ";

    // Цикл продолжается до тех пора пока пользователь вводит

    // неверное значение

    while (!(std::cin >> x)) {

    std::cout << "Bad entry, please try again: ";

    // Очисткабуфераввода

    std::cin.clear();

    std::cin.ignore(std::numeric_limits::max(),'\n');

    }

    std::cout << "Вы ввели " << x << '\n';

    }

    В этой программе выражение

    std :: cin >> x

    имеет логическое значение, которое мы можем использовать в условном или итеративном выражении. Если пользователь вводит значение с типом, совместимым с объявленным типом переменной, выражение оценивается как true; в противном случае это интерпретируется как false.

    Выражение ! (std :: cin >> x) возвращает значение true, если ввод неправильный. Неверный ввод символов пользователя, приводит к тому, что объект std :: cin переходит в состояние ошибки.

    Объект входного потока остается в состоянии ошибки, пока программист не сбросит его вручную с помощью выражения

    cin.clear(); // сбрасывает объект потока, чтобы он мог обрабатывать больше входных данных.

    Если в буфере ввода остаются символы, то это также может привести к переходу объект потока в ошибочное состояние

    Очистка объекта потока не удаляет оставшиеся нажатия клавиш. Решение состоит в том, чтобы удалить из буфера клавиатуры все символы, которые пользователь ввел с момента последнего действительного ввода данных.

    Выражение

    cin.ignore(numeric_limits::max(),'\n');

    удаляет из буфера все символы, вплоть до символа новой строки ('\ n').

    Вызов функции numeric_limits::max() возвращает максимальное количество символов, которое может содержать буфер, поэтому метод ignore читает и отбрасывает символы, пока не прочитает символ новой строки ('\ n') или не достигнет конца буфера, что наступит раньше.

    Как только объект потока был сброшен из состояния ошибки и буфер клавиатуры пуст, пользовательский ввод может действовать как обычно.

    1 Версия дистрибутива возможно измениться.

    2 В этом формате часть, заключенная в фигурные скобки необязательная



    написать администратору сайта