Почему я получаю мусор (нежелательный) вывод здесь? - PullRequest
0 голосов
/ 13 февраля 2019

Всякий раз, когда я пишу этот следующий код, я получаю вывод мусора (неожиданный) в некотором онлайн-компиляторе, но если я использую блок кода, то получаю удовлетворенный вывод. Итак, мой вопрос, почему я получаю этот тип вывода?

Например, если я ввожу

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 голосов
/ 13 февраля 2019

Основная проблема, которую я вижу в вашем коде, заключается в следующем:

int line[n];

Это называется VLA (массив переменной длины) и не поддерживается в C ++.Это допустимо в C. Большинство компиляторов все еще допускают такое поведение из-за того факта, что C ++ основан на C, но он не является допустимым кодом C ++.В предыдущем вопросе я узнал, что clang поддерживает назначенные инициализаторы, а gcc и vc ++ - нет.Причина в том, что некоторые компиляторы, такие как clang, по умолчанию поддерживают расширения c99.Я хочу сказать, что если код компилируется, это не значит, что он всегда прав.

Если вы скомпилируете аргумент -pedantic, вы увидите, что компилятор предупреждает вас о том, что это функция C99,Посмотрите на пример rextester здесь .Из комментариев ниже, использование -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.

Но это опять же означает, что вызнать размер массива во время компиляции.

...