【问题标题】:C++ Primer fifth edtion book (if statement) is this not correct?C++ Primer第五版书(if语句)这不正确吗?
【发布时间】:2013-03-20 03:20:56
【问题描述】:
#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 次​​p>

62 出现 1 次

100 出现 3 次

所有这些代码都应该可以正常工作。很抱歉给您带来不便。(脑子放个屁)

【问题讨论】:

  • 如果读取失败,cin &gt;&gt; x 用作条件将是错误的,这对于确保您只对良好的输入采取行动非常重要。

标签: c++


【解决方案1】:

这个appears to work as expected

if 语句或while 循环的条件下执行std::cin &gt;&gt; whatever 是有充分理由的。提取运算符&gt;&gt; 返回您正在操作的流。所以std::cin &gt;&gt; whatever 表达式的值就是std::cin 本身。

流,例如std::cin,可以转换为bool,以检查流是否处于有效状态。考虑:

if (std::cin >> whatever)

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

同样:

while (std::cin >> whatever)

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

什么是无效输入?那么如果上面示例中的whateverint,并且用户输入了文本blah,这将失败,因为它不是一个有效的整数。

【讨论】:

    【解决方案2】:

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

    表达式stream &gt;&gt; variable 产生一个对stream 的引用,然后作为if 条件,它被转换为bool 就像你写了!(stream &gt;&gt; variable).fail()。 p>

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

    因此,除非作者的目的是说明技术上不好的代码(也许会讨论它的所有问题),否则它在教学上是不好的。

    这里是一个冗余更少的替代公式:

    #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:\开发\测试] > g++ foo.cpp [D:\开发\测试] > 回声 42 42 42 42 42 55 55 62 100 100 100 |一个 42 发生 5 次 55 出现 2 次 62 发生 1 次 100 出现 3 次 [D:\开发\测试] > _

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多