Урок №11. cout, cin и endl

  Юрий  | 

  |

  Обновл. 20 Дек 2022  | 

 319110

 ǀ   48 

На этом уроке мы рассмотрим такие объекты, как cout, endl и cin, существующие в языке C++.

Объект std::cout

Как мы уже говорили на предыдущих уроках, объект std::cout (который находится в библиотеке iostream) используется для вывода данных на экран (в консольное окно). В качестве напоминания, вот наша программа «Hello, world!»:

Для вывода нескольких предложений на одной строке оператор вывода << нужно использовать несколько раз, например:

Программа выведет:

a is 7

А какой результат выполнения следующей программы?

Возможно, вы удивитесь, но:

Hi!My name is Anton.

Объект std::endl


Если текст нужно вывести раздельно (на нескольких строках) — используйте std::endl. При использовании с std::cout, std::endl вставляет символ новой строки. Таким образом, мы перемещаемся к началу следующей строки, например:

Результат:

Hi!
My name is Anton.

Объект std::cin

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

Попробуйте скомпилировать и запустить эту программу. При запуске вы увидите Enter a number:, а затем программа будет ждать, пока вы укажите число. Как только вы это сделаете и нажмете Enter, программа выведет You entered, а затем ваше число.

Например (я ввел 7):

Enter a number: 7
You entered 7

Это самый простой способ получения данных от пользователя. Мы будем его использовать в дальнейших примерах.

Если ваше окно закрывается сразу после ввода числа — смотрите Урок №7 (там есть решение данной проблемы).

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

std::cin, std::cout, << и >>


Новички часто путают std::cin с std::cout и << с >>. Вот простые способы запомнить их различия:

  std::cin и std::cout всегда находятся в левой стороне стейтмента;

  std::cout используется для вывода значения (cOUT = вывод);

  std::cin используется для получения значения (cIN = ввод);

   оператор вывода << используется с std::cout и показывает направление, в котором данные движутся от r-value в консоль. std::cout << 7; (значение 7 перемещается в консоль);

   оператор ввода >> используется с std::cin и показывает направление, в котором данные движутся из консоли в переменную. std::cin >> a; (значение из консоли перемещается в переменную a).

Примечание: Также Вы можете приобрести Самоучитель «Уроки по С++» в .pdf-формате.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 794 оценок, среднее: 4,91 из 5)
Загрузка...

Комментариев: 48

  1. Wadim:

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

  2. Сергей:

    Очень доходчиво описано по поводу операторов ввода и вывода. Читаю уроки с наслаждением, хотя уже давно программирую на С++, но в некоторых вопросах еще плаваю.

  3. Алексей:

    Здравствуйте Юрий, спасибо за уроки. Но очень не хватает информации по вот такой конструкции:

    часто встречаю ее, и не понимаю, она просто взрывает мозг))) помогите разобраться

    1. KonSit:

      Эта строка показывает, что цикл будет выполнятся столько раз, сколько пользователь введет, то есть даст значение переменной input_value

      1. Алексей:

        Это понятно, но что будет признаком конца ввода??? Enter такой ввод игнорирует, считая его разделителем!

      2. Владимир:

        Боюсь тут все немного по другому:
        while это и правда цикл и он будет выполнятся бесконечно пока условие в скобках будет "истинно", то есть не равно 0, это может быть что угодно(хоть цифра, хоть буква, хоть символ). Все что не равно нулю воспринимается как "истинна".
        То есть в скобках происходит записывание того что вы введете с клавиатуры в переменную input_value, а затем будет произведена проверка содержимого этой переменной на 0. Если это не ноль то цикл повторяется и снова ждет что вы введете на клавиатуре.
        НО! я мало знаю о visual studio, но если это воспроизвести вручную и сделать переменную input_value типа int, затем запустить программу и ввести 0, он все равно повторяет цыкл, а стоит ввести любую букву он записывает в эту переменную как 0 и завершает цикл. Вспоминается мем с Ньютоном: "Ну я **й его знает…"

    2. Дмитрий:

      Условие в цикле while имеет значения 0 либо 1. 0 это 0, 1 это все что угодно другое. При выполнении std::cin >> value, данная инструкция возвратит 0 при возникновении ошибки ввода.

      Если value имеет тип данных int и вы вводите целые значения с клавиатуры цикл не завершиться, так ошибки ввода скорее всего не произойдет. Но стоит вам ввести, условно, символ, то данная инструкция вернет 0, как ошибку и цикл завершиться.

      Попробуйте такой пример:

      Запустите и введите символ. Вылезет "Error".
      Далее для продолжения ввода придется использовать std::cin.clear() и std::cin.ignore(), подробнее об этом уже найдете в гугле 🙂

  4. Oleg:

    В каких случаях лучше использовать "using namespace std", а в каких "std::"?

  5. Андрей:

    Почему мало где объясняются сокращённые названия операторов?
    От этого ведь намного проще запомнить большинство операторов. А новичкам этого так не хватает)
    Например, cin — console input, cout — console output

    1. CppTeacher:

      префикс c означает characters, а не console

  6. Анастасия:

    Здравствуйте! Правильно ли я поняла из примера std::cin, что сначала мы инициализируем переменную a в ноль, а потом (грубо говоря) прямо из консоли меняем значение на 7?

    1. Фото аватара Юрий:

      Здравствуйте! Да, всё верно. В последнем примере мы инициализируем переменную a значением 0, а затем пользовательским вводом ("прямо из консоли") значение меняется на 7.

  7. visedo:

    В Microsoft Visual Studio Community 2019
    при использовании cin cout компоновщик подключает
    VCRUNTIME140_1D.dll в конфигурации x64 Debug и
    VCRUNTIME140_1.dll в конфигурации x64 Release,
    что негативно сказывается на переносимость.
    Можете прокомментировать и есть ли решение?

    1. visedo:

      я нашел решение
      проект — свойства конфигурации — дополнительно — использование MFC
      поставить "использовать MFC в статической библиотеке"
      Тогда эти dll-ки будут завернуты внутрь. Размер файла немного увеличиться конечно.

  8. Alan:

    Как по мне было бы полезно упомянуть, что метод std::cin принимает от пользователя из консоли не строку, что кажется логично, а только значение до первого пробела, а если пользователь захочет считать строку, то для этого надо использовать getline();.

  9. Enceladus:

    Читал, что болеубийца painkiller и beksheikh пишут в Dev-C++, от себя хочу вставить пять копеек, пишу в нативном Eclipse CDT, под управлением Linux-овой осью. И по этому нет проблем типа преждевременного закрытия окна консоли 🙂 Вообще, вижу, что Линуксовые ОС это идеальный полигон для изучения C++

    1. Фото аватара Дмитрий Бушуев:

      >>Вообще, вижу, что Линуксовые ОС это идеальный полигон для изучения C++

      Если вы готовы разменять личную жизнь на линуксовые ОС, то — да. 🙂

  10. Ростик:

    как std::cin получает данные от пользователя с помощью оператора ввода?

  11. Олег:

    Здравствуйте. Я не давно начал изучать программирование в целом. Не могли бы вы объяснить почему переменной а мы присвоили значение 0

    1. Фото аватара Юрий:

      Привет. Мы таким образом инициализировали a, обнулив её. В этом примере впринципе без этого можно обойтись, но в более сложных программах обнуление используется для того, чтобы предотвратить случайное или "мусорное" значение, которое могло быть присвоено переменной a где-то в коде раньше.

    2. Алексей:

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

  12. Sergey Groysman:

    День добрый, Юрий.
    Спасибо за ваши уроки.
    Преамбула вопроса — при выполнении данной функции у меня вводимая переменная d отображается при её вводе и потом повторно уже в команде cout. Вопрос: как её убрать из видимости при вводе и оставить только в команде cout?
    Спасибо.

    1. Фото аватара Юрий:

      Привет. Чтобы скрыть вводимое значение, нужно добавить заголовочный файл:

      И прописать следующие строчки в функции main():

      Готовый код:

      1. Sergey Groysman:

        Спасибо.

        1. Фото аватара Юрий:

          Пожалуйста 🙂

  13. Анна:

    Нигде не могу найти, в чем смысл данной строки? просто возврат каретки?

    1. Фото аватара Юрий:

      endl — это перенос на новую строку и очистка потока, аналог переноса на новую строку — ‘\n’. cout << endl, как отдельная строчка, используется просто для переноса на новую строку, двойной cout << endl используется для пробела между строками (результат виден в консоли). Т.е. можно в конце строки добавить '\n':

      Либо

      Результат один и тот же, просто endl еще и очищает за собою поток данных.

      1. Анна:

        Спасибо! Теперь все понятно 🙂

  14. beksheikh:

    Здравствуйте.объясните если возможно для чего надо ставить стд?можно же и без него..работаю на дев с++.и еще для чего нужен std::cin(get)?..если хотите могу написать полный код.С уважением Я)).

    1. Фото аватара Юрий:

      Привет, об std:: говорится в уроке 24 и в уроке 54. Следуйте порядку, в котором изложены уроки и всё узнаете — всё, что вам нужно знать.

      Об std::cin(get) первый раз слышу, возможно std::cin.get()?

      1. beksheikh:

        Да.)не правильно написал

        1. Фото аватара Юрий:

          cin.get() считывает из входного потока данных один символ, используется для "задержания" консольного окна.

    2. painkiller:

      Тоже работаю в этой IDE — она более простая и понятная для новичка!
      Чтобы не было никаких проблем с преждевременным закрытием окна консоли, нужно перед последней фигурной скобкой (}) писать следующее:
      cin.ignore(); — последнее нажатие ENTER игнорируется;
      cin.get(); — ждёт этого нажатия от Вас;

      1. Данила:

        сделал как вы написали — ничего не ввышло.

  15. Иван:

    Здравствуй. Подскажи как поместить в одну строку два ввода cin?
    Заранее спасибо.

    1. Фото аватара Юрий:

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

      Между ними можно вставить cout и разместить всё также на одной строке:

      1. Иван:

        Мне нужно, чтобы 2 ввода, в консоли, на одной строчке были. Хочу, чтобы в консоли было примерно так:
        Калькулятор
        Введите цифру: 5 * 6 = 30

        1. Фото аватара Юрий:

          Во-первых, вы пробовали гуглить или искать ответ на StackOverflow?

          Во-вторых, вы можете делать вводы через cin на одной строчке в консоли, просто оставляя пробел между значениями. Например:

          В консоли вы можете вводить значения так:

          7 8

          и нажимать Enter.

          В итоге у вас будет x = 7 и y = 8. Что делать, чтобы выводить результат умножения этих двух значений на этой же строке, где вы ввели 7 и 8 — я не знаю. Вы должны обязательно нажать Enter, чтобы завершить ввод чисел для cin, а когда вы нажимаете Enter, то вы автоматически переходите на следующую строку. Решения, как это всё обойти, я не нашел.

        2. Данила:

          вот попробуйте так в строке ставить знак арифметического действия надо самому —

      2. Алексей:

        А почему в "cout" направление стрелок не в ту сторону ">>" ?

        1. Виталий:

          Здравствуйте Юрий!
          Скажите, будут ли эти программы работать на Андроиде( cppdroid) ?

  16. Katy:

    У меня не отображаются цифры и слова после Enter a number, а когда я поменяла cin на cout всё появилось. Не могли бы вы мне подсказать, что с этим делать?

    1. Фото аватара Юрий:

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

      Cin нужен для ввода данных (слов, цифр, букв, предложений), cout для вывода. Если вы только указываете cin в коде, то выводиться ничего не будет. Если вы указываете только cout, то выводиться будет то, что вы указали вместе с cout. То есть c помощью cin вывести вы не сможете ничего, так как он для этого не предназначен.

  17. Александр:

    Здравствуйте.
    Подскажите, после команд
    std::cin >>
    std::cout <<
    для чего нужны кавычки, ведь и так понятно что,
    std::cin — это ввод
    std::cout — это вывод
    Это просто такой синтаксис или эти команды также используются с другими символоми и соответственно имеют другое предназначение ?

    Начинаю изучение программирования с нуля, поэтому не хочу оставлять пробелов в понимании.

    1. Фото аватара Юрий:

      Привет, кавычки "" являются частью синтаксиса, если вы их не укажете, то получите синтаксические ошибки. "" используются для вывода символов с std::cout в консольное окно, кавычки с std::cin не используются.

      1. Александр:

        Я не однозначно сформулировал вопрос, я имел ввиду не эти кавычки "", а вот эти << и >>.
        Это просто такой синтаксис или команды
        std::cin
        std::cout
        могут использоваться с другими символами и соответственно иметь другое значение ?

        1. Фото аватара Юрий:

          Скобки показывают направление потока данных, >> — поток данных идёт внутрь, << — поток данных идёт изнутри. Скобки являются частью синтаксиса. Cin и cout всегда используются со скобками, другого значения, кроме как ввода/вывода данных у cin/cout нет.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *