为什么我在这里得到垃圾(不需要的)输出?
Why I am getting garbage(unwanted) output here?
每当我编写以下代码时,我都会在某些在线编译器中得到垃圾(意外)输出,但如果我使用代码块,则会得到满意的输出。 所以我的问题是为什么我会得到这种类型的输出?
例如,如果我输入
5 7
+ 5
- 10
- 20
+ 40
- 20
然后我得到
22 1
在代码块中。但是在在线编译器中,它是另外一回事。
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int have, n, i;
int kid=0;
cin>>n>>have;
int line[n];
for(i=0;i<n;i++)
{
cin>>line[i];
if(line[i]>=0)
have+=line[i];
else
{
if(have>=abs(line[i]))
have+=line[i];
else
kid++;
}
}
cout<<have<<" "<<kid<<endl;
}
我在你的代码中看到的主要问题是:
int line[n];
这称为 VLA(可变长度数组),C++ 不支持它。它在 C 中有效。大多数编译器仍然允许这种行为,因为 C++ 基于 C,但它不是有效的 C++ 代码。在上一个问题中,我发现 clang 支持指定的初始化器,而 gcc 和 vc++ 不支持。原因是因为一些编译器像 clang,默认支持 c99-extensions。我的观点是,仅仅因为代码可以编译,并不意味着它总是正确的。
如果您使用 -pedantic
参数进行编译,您将看到编译器警告您这是一个 C99 特性。查看 rextester 示例 here。从下面的评论中,在编译器标志中使用 -pedantic-errors
,将提示错误。
如果你在运行之前知道数组的大小,那么你应该使用静态数组int line[4];
,但如果你不知道,那么你需要使用动态数组。 std::vector 本质上是一个动态数组,它也为你处理内存。它易于使用且非常高效。 std::vector<int> line;
您可以在此处阅读有关矢量容器的更多信息:http://www.cplusplus.com/reference/vector/vector/
顺便说一句,我在 rextester、ideone 和 repl.it 中尝试了您的代码,我得到了相同的结果:22 1
。我认为您正在目睹未定义的行为。
另外,你可以用 constexpr
来限定 int n
就没问题了。
constexr int n = 200;
int line[n]; //now it's ok.
但这又意味着你在编译时就知道数组的大小。
每当我编写以下代码时,我都会在某些在线编译器中得到垃圾(意外)输出,但如果我使用代码块,则会得到满意的输出。 所以我的问题是为什么我会得到这种类型的输出?
例如,如果我输入
5 7
+ 5
- 10
- 20
+ 40
- 20
然后我得到
22 1
在代码块中。但是在在线编译器中,它是另外一回事。
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int have, n, i;
int kid=0;
cin>>n>>have;
int line[n];
for(i=0;i<n;i++)
{
cin>>line[i];
if(line[i]>=0)
have+=line[i];
else
{
if(have>=abs(line[i]))
have+=line[i];
else
kid++;
}
}
cout<<have<<" "<<kid<<endl;
}
我在你的代码中看到的主要问题是:
int line[n];
这称为 VLA(可变长度数组),C++ 不支持它。它在 C 中有效。大多数编译器仍然允许这种行为,因为 C++ 基于 C,但它不是有效的 C++ 代码。在上一个问题中,我发现 clang 支持指定的初始化器,而 gcc 和 vc++ 不支持。原因是因为一些编译器像 clang,默认支持 c99-extensions。我的观点是,仅仅因为代码可以编译,并不意味着它总是正确的。
如果您使用 -pedantic
参数进行编译,您将看到编译器警告您这是一个 C99 特性。查看 rextester 示例 here。从下面的评论中,在编译器标志中使用 -pedantic-errors
,将提示错误。
如果你在运行之前知道数组的大小,那么你应该使用静态数组int line[4];
,但如果你不知道,那么你需要使用动态数组。 std::vector 本质上是一个动态数组,它也为你处理内存。它易于使用且非常高效。 std::vector<int> line;
您可以在此处阅读有关矢量容器的更多信息:http://www.cplusplus.com/reference/vector/vector/
顺便说一句,我在 rextester、ideone 和 repl.it 中尝试了您的代码,我得到了相同的结果:22 1
。我认为您正在目睹未定义的行为。
另外,你可以用 constexpr
来限定 int n
就没问题了。
constexr int n = 200;
int line[n]; //now it's ok.
但这又意味着你在编译时就知道数组的大小。