c++ - 意外的 while 行为 C++(可能与 IDE 相关)

标签 c++ visual-studio while-loop visual-studio-2015

我正在编写一个非常简单的程序来计算和显示输入序列中连续整数的数量(自学 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 循环显然没有终止。控制台继续运行并接受进一步的输入,如果我输入另一个值或非整数,它实际上会返回最后一个值。最终控制台如下所示:

Console

还有另一个输入:

Console 2

然而,当我在像 Ideone 这样的在线编译器中运行相同的代码时,结果是正确的并且循环终止。 http://ideone.com/mUZuh7

Ideone

这是 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):

  1. if (std::cin >> currVal):WAITING来自 std::cin 的输入。您将需要在控制台中输入一些内容,然后按 Enter 键来解决这个问题。
  2. currVal 等于 1,也是您输入的第一个字母。
  3. while (std::cin >> val)std::cin 读取另一个字符。这将读取 2:val 现在是 2
  4. if (val == currVal):1 不等于 2,因此您的代码输出出现的 1 ,并将 currVal 更改为 2
  5. while (std::cin >> val)std::cin 读取另一个字符。这将读取 3:val 现在是 3
  6. if (val == currVal):2 不等于 3,因此您的代码输出出现的 2 ,并将 currVal 更改为 3
  7. while (std::cin >> val)std::cin 读取另一个字符。这将显示为 4:val 现在是 4
  8. if (val == currVal):3 不等于 4,因此您的代码输出出现的 3 ,并将 currVal 更改为 4
  9. while (std::cin >> val)std::cin 读取另一个字符。这将读取另一个 4,并且 val 将保持为 4
  10. if (val == currVal): 4 等于 4,所以 cnt 递增
  11. 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/

相关文章:

visual-studio - 具有不同构建配置的 MSBuild 项目,不使用 sln

asp.net-mvc - 无法到达 Visual Studio 调试 "This site can'”

c++ - .o 生成具有不同规则的 Makefile

javascript - Visual Studio 2017 中背景 javascript 的颜色设置名称

C++:struct 和 new 关键字

java - while 循环中未找到行?

c - 用指针返回一个值(C 程序)

c - do while 语句只执行两次 code::block 和 dev c++

c++ - 绑定(bind) shared_ptr::reset - 未找到匹配的重载函数

c++ - 如何从文本文件中读取字符串类型(不是数字)并将数据存储在 C++ 数组中?