C ++ Primer第五版书(如果声明)这不正确吗?

时间:2013-03-03 17:16:01

标签: c++

#include <iostream>

int main()
{
    int currVal = 0, val = 0;

    if (std::cin >> currVal) {
        int cnt = 1; 

        while (std::cin >> val) { 
            if (val == currVal)
                ++cnt; 
            else 
            {
                std::cout << currVal << " occurs " << cnt << " times" << std::endl;
                currVal = val; 
                cnt = 1; 
            }
        } 

        std::cout << currVal << " occurs " << cnt << " times" << std::endl;
    } 

    return 0;
}

如果我们为此程序提供以下输入:

  

42 42 42 42 42 55 55 62 100 100 100

然后输出应该是

  

42次发生5次

     

55次发生2次

     

62次发生1次

     

100次发生3次

所有这些代码都应该正常运行。很抱歉给您带来不便。(有一个脑屁)

2 个答案:

答案 0 :(得分:3)

appears to work as expected

有一个很好的理由在std::cin >> whatever语句或if循环的条件下执行while。提取运算符>>返回您正在操作的流。因此std::cin >> whatever表达式的值本身为std::cin

为了检查流是否处于有效状态,可以将诸如std::cin之类的流转换为bool。考虑:

if (std::cin >> whatever)

这可以理解为将用户的输入转换为变量whatever,然后检查输入是否有效。如果不是,if块将不会执行。

类似地:

while (std::cin >> whatever)

这将循环,每次从用户输入,直到用户输入无效的内容。

什么是无效输入?好吧,如果以上示例中的whateverint,并且用户输入了文本blah,则会失败,因为它不是有效的整数。

答案 1 :(得分:0)

您提供的代码按预期工作。

表达式stream >> variable生成对stream的引用,并且作为if条件,然后将其转换为bool ,就好像你一样曾写过!(stream >> variable).fail()

然而,虽然代码在技术上有效,但它有很多冗余

所以,除非作者的观点是要说明技术上的ungood代码(也许是对它的所有错误进行讨论),否则这是教学上不合时宜的。

这是一种备用配方,冗余度更低:

#include <iostream>
using namespace std;

int main()
{
    int current_value = 0;
    int run_length = 0;

    for( bool at_end = false; !at_end; )
    {
        int value;
        at_end = (cin >> value).fail();

        if( run_length > 0 && (at_end || value != current_value) )
        {
            cout << current_value << " occurs " << run_length << " times" << endl;
            run_length = 0;
        }

        if( !at_end )
        {
            if( run_length == 0 )
            {
                current_value = value;
            }
            ++run_length;
        }
    }
}

测试:

[D:\dev\test]
> g++ foo.cpp

[D:\dev\test]
> echo 42 42 42 42 42 55 55 62 100 100 100 | a
42 occurs 5 times
55 occurs 2 times
62 occurs 1 times
100 occurs 3 times

[D:\dev\test]
> _