正在跳过第二个 FOR 循环

时间:2021-01-26 16:08:45

标签: c++ for-loop c++17

我没有收到任何编译时错误,但是每当我运行程序时,第二个 FOR 循环都会被跳过并且程序停止。我在它后面放了一个 cout 并执行了,但仍然跳过了第二个 for 循环。

#include <iostream>

using std::cout;

int main()
{
    int numbers[5];
    for(int i; i < 5; i++)
    {
        std::cin >> numbers[i];
    }
    for(int i; i < 5; i++)
    {
        cout << numbers[i] << "\t";
    }
}

3 个答案:

答案 0 :(得分:2)

在两个 for 循环中,尝试用 int i; 替换 int i = 0;

答案 1 :(得分:2)

写作时

 int i;

这声明了一个名为 inti 而没有初始化它。据说它的价值是不确定的。例如,对于不确定的值,您无能为力。

int x = i;

调用 undefined behavior。当你的代码有 ub 时,几乎任何事情都可能发生。你可能根本没有任何输出,或者一些胡言乱语,或者在屏幕上打印出哈姆雷特(尽管这种情况很少发生)。

您没有在两个循环中初始化计数器。第一个似乎有效纯粹是运气问题。或者说运气不好,因为看起来工作是错误代码最糟糕的化身。

许多指南建议在声明变量后立即初始化它们。通常这是另一种说法:只有在可以初始化变量时才声明它。无论如何,看到int i;应该会让你害怕得瑟瑟发抖;)

您的循环应如下所示:

for(int i=0; i < 5; i++)
{
    std::cin >> numbers[i];
}
for(int i=0; i < 5; i++)
{
    std::cout << numbers[i] << "\t";
}

另一方面,如果您想迭代整个容器,您可以使用基于范围的 for 循环,从而完全消除出现此类错误的机会:

for(auto& n : numbers)
{
    std::cin >> n;
}
for(const auto& n : numbers)
{
    std::cout << n << "\t";
}

请注意,大多数编译器都可以诊断初始化变量的使用。随着-Wall -Werror叮当声refuses to compile your code。不幸的是,gcc 无法诊断您代码中的问题(虽然它可以非常可靠地诊断诸如 int i; int x = i; 之类的情况)。因此,您应该注意警告,并确保您不会错过它们,您可以将它们视为错误。

答案 2 :(得分:1)

来自维基百科:Unintialized variable in C

<块引用>

新手程序员的一个常见假设是,所有变量在声明时都设置为一个已知值,例如零。虽然这适用于许多语言,但并非适用于所有语言,因此存在出错的可能性

在 C++/C 中,当您不初始化变量时,它会从内存或变量堆栈中获取当前值,您不能期望特定值。

始终在 C/C++ 中初始化变量被认为是一个好习惯。所以只需将您的代码更改为: for(int i = 0; i < 5; i++) 用于两个循环,它会起作用。

额外

你的 IDE 应该警告你关于未初始化的变量,检查插件如 cppcheck 或任何类型的 c/c++ linter