C++ Значение моей входной переменной изменяется само по себе?

int main() {
    int m;
    cin >> m;
    int len = 0;
    if (m <= 1) {
        cout << m << endl;
        return 0;
    } else {
        int a[] = {
            0,
            1
        };
        for (int i = 2; i <= m * m; ++i) {
            cout << "second" << m << " " << m * m << endl;
            a[i] = (a[i - 2] + a[i - 1]) % m;
            cout << m << " " << m * m << endl;
            if (a[i] == 1 && a[i - 1] == 0) {
                len = i - 1;
                break;
            }
        }
    }
    cout << len << endl;
    return 0;
}

Выход

2
second2 4
1 1
0

Я сохраняю ввод в переменную m (в примере входное значение равно 2). Однако после утверждения a[i] = (a[i-2]+a[i-1])%m; значение m становится равным 1. Не происходит никакого уменьшения или чего-то еще, что могло бы вызвать это?

Причиной этого является тот факт, что ваш массив имеет размер два, но вы относитесь к нему так, как если бы он был намного больше.

john 26.12.2020 07:21

Откуда вы знаете, что значение m становится равным 1? Значение m остается постоянным -> cpp.sh/7ep3li

kesarling He-Him 26.12.2020 07:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Массив a состоит только из 2 элементов, поэтому запись (и чтение) в a[2] и выше не разрешена.

Вы должны использовать std::vector для динамического добавления элементов в массивы.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;

int main() {
    int m;
    cin>>m;
    int len=0;
    if (m<=1) {
        cout<<m<<endl;
        return 0;
    }
    else {
        std::vector<int> a = {0,1}; // initializer list, which is supported in C++11 and later
        for(int i=2; i <= m*m; ++i) {
            cout<<"second"<<m<<" "<<m*m<<endl;
            a.push_back((a[i-2]+a[i-1])%m); // use push_back to add elements
            cout<<m<<" "<<m*m<<endl;
            if (a[i]==1 && a[i-1]==0) {
                len=i-1;
                break;
            }
        }
    }
    cout<<len<<endl;
    return 0;
}

Это сработало! Я должен был это видеть. Однако я не понимаю, как это повлияет на значение m.

newbeetocpp 26.12.2020 07:26

Помимо очевидной ошибки, сделанной OP (которая, как вы указали, является реальной проблемой), столкновение с «ошибкой» OP - значение m изменений - не может быть воспроизведено (и не должно быть воспроизведено в первую очередь). Я отмечаю это как невоспроизводимое, потому что я не получаю тот же результат, что и OP.

kesarling He-Him 26.12.2020 07:26

@ d4rk4ng31 Неопределенное поведение вызывается при доступе за пределами диапазона. Поведение не обязательно должно быть одинаковым во всех средах.

MikeCAT 26.12.2020 07:27

Да, но не будет ли это поведение «влиять» только на переменные, вызывающие неопределенное поведение? Как можно повлиять на m, инициализированную переменную, полностью отделенную от массива?

kesarling He-Him 26.12.2020 07:27

@ d4rk4ng31 Нет. UB означает то, что он говорит, это неопределенное поведение. Абсолютно все в вашей программе может пойти не так.

cigien 26.12.2020 07:34

Другие вопросы по теме