C++ 入门 1.4.4.不太理解第一个IF语句的必要性

C++ Primer 1.4.4. Can't quite understand the need of first IF statement

本文关键字:IF 第一个 语句 必要性 入门 C++      更新时间:2023-10-16

我是新来的,所以请耐心等待。我目前正试图通过c++Primer第5版学习c++,当我看到so关于第1.4.4节的疑问时(我设法找到了答案),我意识到我不理解这个代码上第一个IF语句的必要性或目的:

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

因此,我试图以一种对我来说更"合乎逻辑"的方式来改变它,以便尝试理解IF的必要性,结果这个程序似乎以完全相同的方式工作。。。修改如下:

#include <iostream>
int main()
{   
int currVal = 0, val = 0, cnt=1;    
std::cin >> currVal;         
    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;
}

有人能帮我解释一下吗?我将不胜感激。

如果是空输入或非数字输入,您的第二个版本将打印

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

currVal的值为0count1,这是错误的。

请参阅:operator>>

std::cin >> currVal是一个返回istream引用的表达式。

istream具有由重载运算符提供的到bool的隐式转换。如果没有更多的数据要读取,则计算为false

if正在利用这一点。如果忽略此项,则程序将无法正确运行,因为currVal将设置为零。

其思想是,如果输入不能插入到该变量中,程序将优雅地终止,而不是崩溃。

例如,如果你运行你的程序并给它一个"a"的初始输入,会发生什么?如果你对未修改的版本做同样的事情会发生什么?