为什么我必须在输入的末尾输入一个非整数来结束程序?

时间:2013-10-04 21:25:40

标签: c++ io stdin

#include <iostream>

int main()
{
    int sum = 0, value = 0;

    // read until end-of-file, calculating a running total of all values read
    while (std::cin >> value)
        sum += value; // equivalent to sum = sum + value

    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

此代码如何知道何时完成抓取输入值和显示总和?为什么它只在我输入非整数值时结束?

4 个答案:

答案 0 :(得分:4)

std::istream& operator>>(int)评估为false时,您的循环结束。如果流已命中文件末尾或已标记为错误,则会发生这种情况。输入浮点数会导致后者发生。

<强>详情:
每个流都包含一个指示流状态的位掩码。掩码中的位包括eof位,失败位和坏位(std::ios_base::eofbitstd::ios_base::failbitstd::ios_base::badbit)。第一个是相当明显的:它是在击中EOF时开始的。接下来的两个有点棘手。当输入操作无法读取预期字符或输出操作无​​法生成所需字符时,将设置std::ios_base::failbit。当出现问题时会设置std::ios_base::badbit,例如,您的磁盘已被炸毁。从流引用到布尔值的转换最终涉及检查是否未设置这些位。浮点数中的小数点会导致设置失败位,从而导致循环结束。

答案 1 :(得分:1)

因为只要输入整数,cin >> value表达式的计算结果为true。如果键入非整数,则表达式将失败,因为您尝试将非整数放入value类型的int变量中。

答案 2 :(得分:0)

当没有输入(ctrl-D或流结束)或发生了不好的事情时,

while (std::cin >> value)将结束。输入非整数会产生错误,然后它会终止while

答案 3 :(得分:0)

while (std::cin >> value)表示在std::cin >> value为真时继续运行。方便的是,由于valueint,如果输入的值不能隐式转换为int,那么该表达式将返回false。否则,它会继续前进。