std :: cin берет два разных типа переменных из консоли и «хранит» второй тип для дальнейшего использования? - PullRequest
0 голосов
/ 07 января 2020

Я пишу программу калькулятора. Сначала запрашивается число (сохраненное как double), затем символ оператора (например, '/' или '+') (сохраненный как char), затем второе число (сохраненное как double), чтобы применить операцию к первому.


double number1 = 0;
cout << "What operation would you like to perform?" << endl;
char operation = a;
cin >> operation;

Затем я использую переключатель. Если он читает «+», он будет продолжать работать на

double adding(double& number1)
{
    cout << "What number would you like to add to " << number1 << "?" << endl;
    double number2 = 0;
    cin >> number2;
    number1 = number1 + number2;
    return number1;
}

. Он все равно будет работать, если вы введете +20 для операции char. Это не вызывает ошибки и успешно добавит 20 к вашему начальному числу, даже если + - это символ, а 20 - это целое число. Он пропустит секцию кода cin >> number2; и возьмет 20, которые вы уже набрали из cin >> operation. Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 07 января 2020

std::cin - это объект потока, представляющий stdin или стандартный поток ввода. Оператор >> (я назову его «оператор извлечения») извлекает символы из потока и записывает в переменную. С std::cin он будет пытаться извлечь то, что ему нужно, из того, что уже находится в потоке, но если он исчерпает их, он будет ждать ввода данных от консоли.

На самом деле, если вы запускаете эту программу из оболочки bash, вы можете сказать программе читать stdin из файла:

./a.out < input_file.txt

Все ваши операторы std::cin >> ... будут "пропущены", так как ты говоришь. На самом деле происходит чтение следующего значения из потока (которое в данном случае является содержимым input_file.txt) без ожидания ввода пользователя.

С тех пор, как std::cin ожидает ввода пользователя, он сохранит читая ввод до тех пор, пока вы не нажмете ввод, вы можете ввести больше символов, чем ищет непосредственный оператор std::cin >> Это то, что здесь происходит.

0 голосов
/ 07 января 2020

Не пропускает cin >> number2. cin >> operation читает ОДИН символ (+). Следующая операция, выполняемая с использованием cin, - это cin >> number2, которая будет продолжена с того места, на котором она остановилась то есть, 20 все еще остается для чтения.

Вы действительно не хотите задавать пользователю 3 вопроса, чтобы ввести что-то вроде 50+20 в любом случае. Вы можете просто написать cin >> number1 >> operation >> number2;, затем включить операцию, и у вас уже есть оба используемых номера. Не существует ограничения (afaik) на количество конкатенаций с использованием >>

...