На этом уроке мы рассмотрим такие объекты, как cout, endl и cin, существующие в языке C++.
Объект std::cout
Как мы уже говорили на предыдущих уроках, объект std::cout (который находится в библиотеке iostream) используется для вывода данных на экран (в консольное окно). В качестве напоминания, вот наша программа «Hello, world!»:
1 2 3 4 5 6 7 |
#include <iostream> int main() { std::cout << "Hello, world!"; return 0; } |
Для вывода нескольких предложений на одной строке оператор вывода <<
нужно использовать несколько раз, например:
1 2 3 4 5 6 7 8 |
#include <iostream> int main() { int a = 7; std::cout << "a is " << a; return 0; } |
Программа выведет:
a is 7
А какой результат выполнения следующей программы?
1 2 3 4 5 6 7 8 |
#include <iostream> int main() { std::cout << "Hi!"; std::cout << "My name is Anton."; return 0; } |
Возможно, вы удивитесь, но:
Объект std::endl
Если текст нужно вывести раздельно (на нескольких строках) — используйте std::endl. При использовании с std::cout, std::endl вставляет символ новой строки. Таким образом, мы перемещаемся к началу следующей строки, например:
1 2 3 4 5 6 7 8 |
#include <iostream> int main() { std::cout << "Hi!" << std::endl; std::cout << "My name is Anton." << std::endl; return 0; } |
Результат:
Объект std::cin
std::cin является противоположностью std::cout. В то время как std::cout выводит данные в консоль с помощью оператора вывода <<
, std::cin получает данные от пользователя с помощью оператора ввода >>
. Используя std::cin мы можем получать и обрабатывать пользовательский ввод:
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> int main() { std::cout << "Enter a number: "; // просим пользователя ввести любое число int a = 0; std::cin >> a; // получаем пользовательское число и сохраняем его в переменную a std::cout << "You entered " << a << std::endl; return 0; } |
Попробуйте скомпилировать и запустить эту программу. При запуске вы увидите 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
).
Очень понравился формат изложения,буду ждать новых комментов и объяснений,в этом и есть весь смысл продвижения вперёд.Огромное спасибо!
Очень доходчиво описано по поводу операторов ввода и вывода. Читаю уроки с наслаждением, хотя уже давно программирую на С++, но в некоторых вопросах еще плаваю.
Здравствуйте Юрий, спасибо за уроки. Но очень не хватает информации по вот такой конструкции:
часто встречаю ее, и не понимаю, она просто взрывает мозг))) помогите разобраться
Эта строка показывает, что цикл будет выполнятся столько раз, сколько пользователь введет, то есть даст значение переменной input_value
Это понятно, но что будет признаком конца ввода??? Enter такой ввод игнорирует, считая его разделителем!
Боюсь тут все немного по другому:
while это и правда цикл и он будет выполнятся бесконечно пока условие в скобках будет "истинно", то есть не равно 0, это может быть что угодно(хоть цифра, хоть буква, хоть символ). Все что не равно нулю воспринимается как "истинна".
То есть в скобках происходит записывание того что вы введете с клавиатуры в переменную input_value, а затем будет произведена проверка содержимого этой переменной на 0. Если это не ноль то цикл повторяется и снова ждет что вы введете на клавиатуре.
НО! я мало знаю о visual studio, но если это воспроизвести вручную и сделать переменную input_value типа int, затем запустить программу и ввести 0, он все равно повторяет цыкл, а стоит ввести любую букву он записывает в эту переменную как 0 и завершает цикл. Вспоминается мем с Ньютоном: "Ну я **й его знает…"
Условие в цикле while имеет значения 0 либо 1. 0 это 0, 1 это все что угодно другое. При выполнении std::cin >> value, данная инструкция возвратит 0 при возникновении ошибки ввода.
Если value имеет тип данных int и вы вводите целые значения с клавиатуры цикл не завершиться, так ошибки ввода скорее всего не произойдет. Но стоит вам ввести, условно, символ, то данная инструкция вернет 0, как ошибку и цикл завершиться.
Попробуйте такой пример:
Запустите и введите символ. Вылезет "Error".
Далее для продолжения ввода придется использовать std::cin.clear() и std::cin.ignore(), подробнее об этом уже найдете в гугле 🙂
В каких случаях лучше использовать "using namespace std", а в каких "std::"?
Об этом есть 2 отдельные статьи — «Урок №24. Конфликт имен и std namespace» и «Урок №53. Пространства имен».
Почему мало где объясняются сокращённые названия операторов?
От этого ведь намного проще запомнить большинство операторов. А новичкам этого так не хватает)
Например, cin — console input, cout — console output
префикс c означает characters, а не console
Здравствуйте! Правильно ли я поняла из примера std::cin, что сначала мы инициализируем переменную a в ноль, а потом (грубо говоря) прямо из консоли меняем значение на 7?
Здравствуйте! Да, всё верно. В последнем примере мы инициализируем переменную a значением 0, а затем пользовательским вводом ("прямо из консоли") значение меняется на 7.
В Microsoft Visual Studio Community 2019
при использовании cin cout компоновщик подключает
VCRUNTIME140_1D.dll в конфигурации x64 Debug и
VCRUNTIME140_1.dll в конфигурации x64 Release,
что негативно сказывается на переносимость.
Можете прокомментировать и есть ли решение?
я нашел решение
проект — свойства конфигурации — дополнительно — использование MFC
поставить "использовать MFC в статической библиотеке"
Тогда эти dll-ки будут завернуты внутрь. Размер файла немного увеличиться конечно.
Как по мне было бы полезно упомянуть, что метод std::cin принимает от пользователя из консоли не строку, что кажется логично, а только значение до первого пробела, а если пользователь захочет считать строку, то для этого надо использовать getline();.
Читал, что болеубийца painkiller и beksheikh пишут в Dev-C++, от себя хочу вставить пять копеек, пишу в нативном Eclipse CDT, под управлением Linux-овой осью. И по этому нет проблем типа преждевременного закрытия окна консоли 🙂 Вообще, вижу, что Линуксовые ОС это идеальный полигон для изучения C++
>>Вообще, вижу, что Линуксовые ОС это идеальный полигон для изучения C++
Если вы готовы разменять личную жизнь на линуксовые ОС, то — да. 🙂
как std::cin получает данные от пользователя с помощью оператора ввода?
Здравствуйте. Я не давно начал изучать программирование в целом. Не могли бы вы объяснить почему переменной а мы присвоили значение 0
Привет. Мы таким образом инициализировали a, обнулив её. В этом примере впринципе без этого можно обойтись, но в более сложных программах обнуление используется для того, чтобы предотвратить случайное или "мусорное" значение, которое могло быть присвоено переменной a где-то в коде раньше.
Написав нуль в переменную, мы таким образом выделили место в памяти и присвоили переменной пустое значение. Если же это место уже было выделено и там находилось какое-то значение, присвоением мы его заменили на новое.
День добрый, Юрий.
Спасибо за ваши уроки.
Преамбула вопроса — при выполнении данной функции у меня вводимая переменная d отображается при её вводе и потом повторно уже в команде cout. Вопрос: как её убрать из видимости при вводе и оставить только в команде cout?
Спасибо.
Привет. Чтобы скрыть вводимое значение, нужно добавить заголовочный файл:
И прописать следующие строчки в функции main():
Готовый код:
Спасибо.
Пожалуйста 🙂
Нигде не могу найти, в чем смысл данной строки? просто возврат каретки?
endl — это перенос на новую строку и очистка потока, аналог переноса на новую строку — ‘\n’. cout << endl, как отдельная строчка, используется просто для переноса на новую строку, двойной cout << endl используется для пробела между строками (результат виден в консоли). Т.е. можно в конце строки добавить '\n':
Либо
Результат один и тот же, просто endl еще и очищает за собою поток данных.
Спасибо! Теперь все понятно 🙂
Здравствуйте.объясните если возможно для чего надо ставить стд?можно же и без него..работаю на дев с++.и еще для чего нужен std::cin(get)?..если хотите могу написать полный код.С уважением Я)).
Привет, об std:: говорится в уроке 24 и в уроке 54. Следуйте порядку, в котором изложены уроки и всё узнаете — всё, что вам нужно знать.
Об std::cin(get) первый раз слышу, возможно std::cin.get()?
Да.)не правильно написал
cin.get() считывает из входного потока данных один символ, используется для "задержания" консольного окна.
Тоже работаю в этой IDE — она более простая и понятная для новичка!
Чтобы не было никаких проблем с преждевременным закрытием окна консоли, нужно перед последней фигурной скобкой (}) писать следующее:
cin.ignore(); — последнее нажатие ENTER игнорируется;
cin.get(); — ждёт этого нажатия от Вас;
сделал как вы написали — ничего не ввышло.
Здравствуй. Подскажи как поместить в одну строку два ввода cin?
Заранее спасибо.
Привет. Объясни кодом, на примере, что ты конкретно хочешь. Разместить два стейтмента cin можно на одной строке
Между ними можно вставить cout и разместить всё также на одной строке:
Мне нужно, чтобы 2 ввода, в консоли, на одной строчке были. Хочу, чтобы в консоли было примерно так:
Калькулятор
Введите цифру: 5 * 6 = 30
Во-первых, вы пробовали гуглить или искать ответ на StackOverflow?
Во-вторых, вы можете делать вводы через cin на одной строчке в консоли, просто оставляя пробел между значениями. Например:
В консоли вы можете вводить значения так:
7 8
и нажимать Enter.
В итоге у вас будет x = 7 и y = 8. Что делать, чтобы выводить результат умножения этих двух значений на этой же строке, где вы ввели 7 и 8 — я не знаю. Вы должны обязательно нажать Enter, чтобы завершить ввод чисел для cin, а когда вы нажимаете Enter, то вы автоматически переходите на следующую строку. Решения, как это всё обойти, я не нашел.
вот попробуйте так в строке ставить знак арифметического действия надо самому —
А почему в "cout" направление стрелок не в ту сторону ">>" ?
Здравствуйте Юрий!
Скажите, будут ли эти программы работать на Андроиде( cppdroid) ?
У меня не отображаются цифры и слова после Enter a number, а когда я поменяла cin на cout всё появилось. Не могли бы вы мне подсказать, что с этим делать?
Я не очень понял ваш вопрос. На будущее, если у вас возникают вопросы по вашей программе — прикрепляйте код.
Cin нужен для ввода данных (слов, цифр, букв, предложений), cout для вывода. Если вы только указываете cin в коде, то выводиться ничего не будет. Если вы указываете только cout, то выводиться будет то, что вы указали вместе с cout. То есть c помощью cin вывести вы не сможете ничего, так как он для этого не предназначен.
Здравствуйте.
Подскажите, после команд
std::cin >>
std::cout <<
для чего нужны кавычки, ведь и так понятно что,
std::cin — это ввод
std::cout — это вывод
Это просто такой синтаксис или эти команды также используются с другими символоми и соответственно имеют другое предназначение ?
Начинаю изучение программирования с нуля, поэтому не хочу оставлять пробелов в понимании.
Привет, кавычки "" являются частью синтаксиса, если вы их не укажете, то получите синтаксические ошибки. "" используются для вывода символов с std::cout в консольное окно, кавычки с std::cin не используются.
Я не однозначно сформулировал вопрос, я имел ввиду не эти кавычки "", а вот эти << и >>.
Это просто такой синтаксис или команды
std::cin
std::cout
могут использоваться с другими символами и соответственно иметь другое значение ?
Скобки показывают направление потока данных, >> — поток данных идёт внутрь, << — поток данных идёт изнутри. Скобки являются частью синтаксиса. Cin и cout всегда используются со скобками, другого значения, кроме как ввода/вывода данных у cin/cout нет.