我没有收到任何编译时错误,但是每当我运行程序时,第二个 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";
}
}
答案 0 :(得分:2)
在两个 for
循环中,尝试用 int i;
替换 int i = 0;
。
答案 1 :(得分:2)
写作时
int i;
这声明了一个名为 int
的 i
而没有初始化它。据说它的价值是不确定的。例如,对于不确定的值,您无能为力。
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