我正在编写一个非常简单的程序来计算和显示输入序列中连续整数的数量(自学 while 循环和条件的练习)。代码如下:
#include "stdafx.h" //obviously using VS
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1; //number of consecutive values
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;
}
在最后一行 cout 中,我解释了应该退出 while 循环而不打印最后一个值的 eof 行为。然而,在 VS 2015 中,最后一行没有被打印出来,尽管 cnt 不再递增,但 while 循环显然没有终止。控制台继续运行并接受进一步的输入,如果我输入另一个值或非整数,它实际上会返回最后一个值。最终控制台如下所示:
还有另一个输入:
然而,当我在像 Ideone 这样的在线编译器中运行相同的代码时,结果是正确的并且循环终止。 http://ideone.com/mUZuh7
这是 Visual Studio 的一些异常行为,还是我忽略了我的代码中的一些明显的初学者错误。
谢谢
最佳答案
你在代码中犯了一个错误,作为TeamEnternode points out in their answer这是 Ideone 的异常行为.
当有字符要从 std::cin
读取时,您的 while
循环继续处理;然而,在读取最后一个 4
后,它会递增 cnt
并且不输出任何内容(根据您的 if
语句)。当 while
循环接下来计算 std::cin
时,里面什么都没有了!
如果您不以 double 结束输入(例如 1 2 3 4 4 5
),您的代码可能会像您预期的那样工作。
这是您的代码正在执行的操作(假设输入是 1 2 3 4 4
):
if (std::cin >> currVal)
:WAITING来自std::cin
的输入。您将需要在控制台中输入一些内容,然后按 Enter 键来解决这个问题。currVal
等于1
,也是您输入的第一个字母。while (std::cin >> val)
从std::cin
读取另一个字符。这将读取2
:val
现在是2
。if (val == currVal)
:1
不等于2
,因此您的代码输出出现的1
,并将currVal
更改为2
。while (std::cin >> val)
从std::cin
读取另一个字符。这将读取3
:val
现在是3
。if (val == currVal)
:2
不等于3
,因此您的代码输出出现的2
,并将currVal
更改为3
。while (std::cin >> val)
从std::cin
读取另一个字符。这将显示为4
:val
现在是4
。if (val == currVal)
:3
不等于4
,因此您的代码输出出现的3
,并将currVal
更改为4
。while (std::cin >> val)
从std::cin
读取另一个字符。这将读取另一个4
,并且val
将保持为4
。if (val == currVal)
:4
等于4
,所以cnt
递增while (std::cin >> val)
从std::cin
中没有什么可读的了。
如果您输入另一个不同的字符(例如 5
),while
循环将继续,评估 5 != 4
然后输出4
次并将 currVal
设置为 5
。然后它将再次尝试您的 while
循环;然而,输入再次为空。
Visual Studio 正确运行代码。
关于c++ - 意外的 while 行为 C++(可能与 IDE 相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33114874/