2013-12-12 4 views
0

Я нахожусь в сегменте «looping while» книги с именем C++ programming, написанном Майком Макгратом.Проблемы с простым циклом while

В книге объясняется, как работает цикл while и что он может и чего не может сделать и т. Д. Он дает пример кода, который я понимаю по большей части, за исключением того, что книга не объясняет, и мне было интересно, Вы могли бы это объяснить.

Это код:

#include <iostream> 
#include <vector> 
using namespace std ; 

int main(){ 

vector <int> vec(10) ; 
int i = 0 ; 


    while (i < vec.size()){ 
    i ++ ; 
    vec[i-1] = i ; 
    cout << " | " << vec.at(i-1) ; 
    } 
} 

Теперь это путь я читаю это, и я уверен, что я читаю это неправильно, потому что результаты не имеют никакого смысла для меня:

Пока я меньше 10 (размер), продолжайте выполнение этого кода. Поэтому целое число i равно 0, но оно увеличивается до 1 в начале кода. Далее, однако, это та часть, о которой я так смущен.

Он говорит vec [i-1], почему он вычитает 1? А затем сделать его равным i? Если я попытаюсь сделать это vec[i] = i;, программа выйдет из строя. Поэтому, как я его читаю, vec[i - 0 ] должно быть 0, так как 0 был только что увеличен до 1 на предыдущем шаге цикла while. Затем, чтобы отобразить результаты, он снова вызывает команду vec.at() на i-1, что еще больше смущает меня. Я просто не понимаю, что означает -1 в векторе. Разве не должно быть то, что находится внутри скобок, означает положение внутри вектора?

The code

The execution

ответ

1

Как Lightness отметил, что необходимо вычитать 1, чтобы вернуться к индексации на основе 0. Цикл такой же, как показано ниже.

vector<int> vec(10); 
int i = 0; 
while(i < vec.size()) 
{ 
    vec[i] = i + 1; 
    cout << " |" << vec.at(i); 
    i++; 
} 
  • , поэтому выход печатается с 1 по 10.
  • в векторе, [I-1] означает минус текущее значение I на 1 затем присвоить значение в качестве индекса к вектору. (примечание: вычитаемое значение не привязано к i)
  • такое же описание, как указано выше для vec.at (i-1)
+0

И это намного лучший способ написать это. (Конечно, вы, вероятно, не должны использовать 'at', а скорее' [] ', с включенными параметрами отладки, но здесь это не имеет значения.) –

6

Потому что в первой строке тела цикла он увеличивается на единицу i (что делает его 1 на первой итерации), поэтому ему нужно вычесть 1, чтобы вернуться к действительной индексации массивов (где 0 является первым индексом массива, а n-1 является последним).

Программы падает, когда вы меняете что, потому что вы бы доступ к vec[1]vec[N] (где N является размером вектора) вместо vec[0] к vec[N-1], реальному допустимому диапазону вектора.

Он назначает i так, чтобы каждый векторный элемент содержал увеличивающийся счетчик. Это немного запутанно.

vec[0] = 1 
vec[1] = 2 
vec[2] = 3 
... 
vec[9] = 10 

Было бы лучше написать так:

int i = 0; 
while (i < vec.size()) { 
    vec[i] = i+1; 
    cout << " | " << vec[i]; 
    i++; 
} 

или:

for (int i = 0; i < vec.size(); i++) { 
    vec[i] = i+1; 
    cout << " | " << vec[i]; 
} 
+0

Я предполагаю, что не оператор [] «сбой» программы, так как большая часть времени зарезервированная память больше, чем размер, но при() определенно повысит неперехваченное исключение и таким образом, прервать программу – stefaanv

+0

. Я начинаю понимать это, то, что находится внутри скобки, означает положение, а остальное просто то, что будет печататься на экране, поэтому необходимо вычесть или добавить. –

+0

благодарит за вашу помощь. –

Смежные вопросы