Вопрос по циклам

229
19 декабря 2016, 19:45

Привет, ребят! У меня вопрос. Почему в коде ниже place_number в конце равен коду последнего символа?

#include <iostream>
using namespace std;
main()
{
    int place[3];
    int place_number = 0;
    char place_value;
    while (place_number < 3)
    {
        place_number = place_number + 1;
        cin >> place_value;
        place[place_number] = place_value;
    }
    cout << place[1] << " " << place[2] << " " << place[3] << " " << place_number;
    return 0;
}

Пример выполнения:

M 
N 
L 
77 78 76 76

UPD: Вопрос решён!

#include <iostream>
using namespace std;
    main()
    {
        int place[3];
        int place_number = 0;
        char place_value;
        while (place_number < 3)
        {
            cin >> place_value;
            place[place_number] = place_value;
            place_number = place_number + 1;
        }
        cout << place[0] << " " << place[1] << " " << place[2] << " " << place_number;
        return 0;
    }
Answer 1

У вас ошибка в коде, в С++ массивы начинаются с 0, а не с 1. А у вас place_number равен 1 когда первый раз пытаетесь записать в массив. Измените цикл...

while (place_number < 3)
{
    cin >> place_value;
    place[place_number] = place_value;
    place_number = place_number + 1;
}

или используйте for

for (int place_number = 0; place_number < 3; place_number++) {
    cin >> place_value;
    place[place_number] = place_value;
}
Answer 2

Массив place содержит три элемента. Поэтому элемента place[3] в нем нет. Но в массивов с++ отсутствует проверка на границы и запись place[3] это просто (place+3*sizeof(int)). А там, по этому адресу совершенно случайно оказался place_number. И его распечатало.

Answer 3

Потому что вы забыли про то, что нумерация массивов начинается с нуля. Вы в теле цикла сначала увеличиваете place_number который является индексом текущего элемента, а только потом пишете в place[place_number] введенное значение. То есть вы сначала пишете значение в place[1] затем в place[2] а потом в place[3] Но place[3] у вас нет (массив состоит из трех, а не из четырех элементов), поэтому вы пишете значение уже за пределы массива. Следующие 4 байта (или сколько у вас под int) заняты переменной place_number. Не уверен, что именно так будет всегда и везде, скорее всего с другим компилятором и другой архитектурой вы получите какой-то иной эффект.

READ ALSO
Что такое pair и где использовать?

Что такое pair и где использовать?

Не могу понять зачем такое объединение двух объектов разного или одного типа, в один объект? И чем это отличается от map? И как или какой смысл...

226
Полиморфизм

Полиморфизм

Требуются помощь с реализацией трех задачДумаю над их реализацией больше недели

186
Присвоить значение элементу массива

Присвоить значение элементу массива

Только начал изучать С++, возникла сложностьНеобходимо присвоить определенному элементу массива значение

168