2
#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

4 回答 4

4

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

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

于 2013-10-04T21:29:33.840 回答
1

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

于 2013-10-04T21:28:02.273 回答
0

while (std::cin >> value)将在没有输入(ctrl-D 或流结束)或发生错误时结束。您输入的非整数会出现错误,然后终止while

于 2013-10-04T21:27:41.660 回答
0

这条线说在真实的情况while (std::cin >> value)下继续运行。std::cin >> value方便的是,因为valueis an int,如果您输入的值不能隐式转换为 an int,那么该表达式将返回 false。否则,它会继续进行。

于 2013-10-04T21:28:00.583 回答