C++ 入门 1.4.4.不太理解第一个IF语句的必要性
C++ Primer 1.4.4. Can't quite understand the need of first IF statement
我是新来的,所以请耐心等待。我目前正试图通过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
的值为0
,count
为1
,这是错误的。
请参阅:operator>>
std::cin >> currVal
是一个返回istream
引用的表达式。
istream
具有由重载运算符提供的到bool的隐式转换。如果没有更多的数据要读取,则计算为false
。
if
正在利用这一点。如果忽略此项,则程序将无法正确运行,因为currVal
将设置为零。
其思想是,如果输入不能插入到该变量中,程序将优雅地终止,而不是崩溃。
例如,如果你运行你的程序并给它一个"a"的初始输入,会发生什么?如果你对未修改的版本做同样的事情会发生什么?
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- 为什么我的代码在第一个 if 语句处中断?
- 输入后,我的程序似乎跳过了第一个IF语句,直接转到ELSE
- 程序仅执行第一个 IF 语句
- C++程序仅执行第一个"if"语句
- C++ 入门 1.4.4.不太理解第一个IF语句的必要性
- 为什么无论输入如何,我的第一个 "if" 语句都会执行?
- 为什么我的第一个 if 语句有效,但我的 else if 语句在它之后不起作用
- Visual c++编译器忽略第一个if语句