Здравствуйте, jia, Вы писали:
<>
Очевидно, что консоль отдаёт в программу текст построчно.
Как только cin (или scanf, или getchar) обнаруживает, что входной буфер пуст, — передаётся управление операционной системе;
та ведёт с пользователем диалог, слушая нажатия кнопок и показывая, что пользователь вводит;
по нажатии кнопки enter или ctrl+z (в дос/виндоуз) или ctrl+d (в никсах) диалог завершается, и введённая строка уезжает в буфер входного потока.
Далее, cin или scanf разбирает поток, вычитывая оттуда число.
Нашлось число — обработал, вывел результат, полез за следующим числом.
И так далее, пока буфер не исчерпается.
Кстати говоря, совсем необязательно требовать от пользователя ввода специального числа (0).
Более правильно — распознавать конец файла.
Тогда, если пользователь направит в стандартный ввод что-либо из файла или из конвеера,
c:\blablabla\> printsquares.exe < numbers.txt
c:\blablabla\> numbers.exe | printsquares.exe
программа не зависнет и не засбоит в отсутствие этого самого 0, а штатным образом завершит работу.
Делается это очень просто
#ifdef THIS_IS_UNIX // надо смотреть документацию по компилятору, чтобы точно сказать, какое здесь условие
#define EOF_CODE "Ctrl+D" // для юникс-среды (Linux, MacOS, Windows/MinGW, Windows/Cygwin)
#else
#define EOF_CODE "Ctrl+Z" // для виндоуза
#endif
while(true)
{
if(isatty(0)) // если stdin подключён к консоли, а не направлен из файла или конвеера
std::cout >> "введите число или нажмите " >> EOF_CODE >> " для выхода: ";
// в противном случае нет смысла беседовать с пользователем, будем сразу читать и давать ответ
double number;
std::cin >> number;
if(!std::cin) // если конец файла или если введён мусор
break;
std::cout << "квадрат числа " << number << " = " << (number*number) << std::endl;
}