std::cin 正在从控制台获取两种不同的变量类型,而 'storing' 第二种类型稍后使用?

std::cin is taking two different variable types from console and 'storing' the second type for later?

我正在写一个计算器程序。它首先请求一个数字(存储为双精度),然后是一个运算符符号(例如“/”或“+”)(存储为字符),然后是第二个数字(存储为双精度)以将操作应用于第一个。


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;
}

char操作输入+20依然有效。它不会导致错误,并且会成功地将 20 添加到您的初始数字,即使 + 是一个 char 而 20 是一个 int。它将跳过代码的 cin >> number2; 部分并从 cin >> operation 中取出您已经输入的 20。为什么会这样?

它不会跳过 cin >> number2cin >> operation 读取一个字符(+)。使用 cin 进行的下一个操作是 cin >> number2,它将从中断处继续。即,20 仍有待阅读。

你真的不想问用户 3 个问题来输入像 50+20 这样的东西。你可以简单地写 cin >> number1 >> operation >> number2; 然后打开操作,你已经可以使用两个数字了。使用 >>

的连接数量没有限制 (afaik)

std::cin 是表示 stdin 或标准输入流的流对象。 >> 运算符(我将其称为 "extraction operator")从流中提取字符并写入变量。使用 std::cin,它将尝试从流中已有的内容中提取所需内容,但如果用完这些内容,它将等待来自控制台的用户输入。

事实上,如果您是 运行 这个来自 bash shell 的程序,您可以告诉程序改为从文件中读取 stdin

./a.out < input_file.txt

你所有的 std::cin >> ... 语句都会像你说的那样得到 "skipped"。实际发生的是它在不等待用户输入的情况下从流中读取下一个值(在本例中是 input_file.txt 的内容)。

因为当 std::cin 等待用户输入时,它会一直读取您的输入,直到您按下回车键,您可以输入比直接 std::cin >> 语句要查找的字符更多的字符。这就是这里发生的事情。