Как раскомментирование строки cout меняет окончательный ответ? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующий код

#include <bits/stdc++.h>

using namespace std;

int main() {

    int r = 0, c = 0;
    int best = 0;

    cin >> r >> c;
    int myGrid[r + 2][c + 2] = {};

    for (int i = 1; i < r + 1; i++) {
        for (int j = 1; j < c + 1; j++) {
            cin >> myGrid[i][j];
        }
    }

    bool stillIn = false;

    int di[] = {-1,-1, -1, 0, 0, 1, 1, 1};
    int dj[] = {-1,0, 1, -1, 1, -1, 0, 1};

    for (int i = 1; i < r + 1; i++) {
        for (int J = 1; J < c + 1; J++) {
            stillIn = false;
            for (int k = 0; k < 8; k++) {
    //        cout << myGrid[i][J] << " " << endl;
                if (myGrid[i][J] == myGrid[di[k]][dj[k]]) {
                    stillIn = true;
                }
            }
            if (stillIn == true) {
                best = myGrid[i][J];
            }
        }
    }

    cout << best;

    return 0;
}

Если я запускаю код со следующим вводом:

4 3
0 1 0
1 2 0
1 5 1
2 3 4

Он печатает 4. Однако, если я раскомментирую строку 28, которая

//        cout << myGrid[i][J] << " " << endl;

Тогда он дает мне 1, что является правильным ответом. Почему это происходит!? Как использование cout меняет окончательный ответ?

Заранее благодарим за любую помощь.

1 Ответ

3 голосов
/ 19 апреля 2020

У вас неопределенное поведение (UB), потому что вы индексируете за пределами этой строки

myGrid[di[k]][dj[k]]

, потому что di и dj содержат значения -1.

Если у вас есть UB, то может произойти все, например, оператор cout, существующий или нет, изменяющий программу странными способами.

Также массивы переменной длины недопустимы в стандартном c ++.

...