为什么我在这里得到垃圾(不需要的)输出?

时间:2019-02-13 14:56:41

标签: c++ cout

每当我编写下面的代码时,都会在某些在线编译器中得到垃圾(意外的)输出,但是如果我使用代码块,则会得到满意的输出。 所以我的问题是为什么我得到这种类型的输出?

例如,如果我输入

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;

}

1 个答案:

答案 0 :(得分:1)

我在您的代码中看到的主要问题是:

int line[n];

这被称为VLA(可变长度数组),C ++不支持。它在C中有效。由于C ++基于C,但大多数编译器仍允许此行为,但它不是有效的C ++代码。在上一个问题中,我发现clang支持指定的初始化程序,而gcc和vc ++不支持。原因是因为某些编译器(例如clang)默认支持c99扩展名。我的观点是,仅仅因为代码可以编译,并不意味着它总是正确的。

如果使用-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。我认为您正在目睹它的不确定行为。

此外,您可以将int n限定为constexpr,就可以了。

constexr int n = 200;
int line[n]; //now it's ok.

但这又意味着您在编译时就知道数组的大小。