Циклы и итератор C ++ - PullRequest
       22

Циклы и итератор C ++

0 голосов
/ 28 февраля 2020

почему итератор (int i) в моем коде равен n + 1 в конце, если l oop означает, что он должен останавливаться на n?

int n, i, j;

cout << "N: ";
cin >> n;

int a[n];

for (int C = 0; C < n; C++){
    cout << "a[" << C+1 << "] = ";
    cin >> a[C];
   }

for (i = 1; i <= n; i++){
    for (j = 0; j < n; j++){
        if (a[j] == i) {
            j = 500;
            break;
        }

    }
    cout << i << " ";
    if (j != 500) {
        break;
    }
}

cout << endl;
if (i == n+1){
    cout << 0 << " and i = " << i << endl;
}

вот пример компиляции:

N: 5

a [1] = 1

a [2] = 2

a [3] = 3

a [4] = 4

a [5] = 5

1 2 3 4 5 0 и i = 6

Программа завершилась с кодом выхода: 0

вопрос, почему я = 6?

Ответы [ 4 ]

1 голос
/ 28 февраля 2020

Кажется, причина в опечатке этого фрагмента кода

if (j != 500) {
    break;
}

, которая появляется во внешнем l oop.

Я думаю, вы имеете в виду

if (j == 500) {
    break;
}

В противном случае внешний l oop продолжает повторяться, потому что для каждого значения i в массиве a есть соответствующее значение в соответствии с входными данными.

1 голос
/ 28 февраля 2020

A-l oop семантически эквивалентно (см. cppreference ):

{
    init_statement
    while ( condition ) {
        statement
        iteration_expression ;
    } 
} 

В вашем случае это будет

for (j = 0; j < n; j++){
    //...
}

эквивалентно

{ 
    j = 0;
    while (j < n) {
        // ...
        j++;
    }
}

Для остановки l oop условие (j<n) должно стать false. Следовательно, если вы проверяете счетчик после l oop, вы видите не счетчик последнего итерата, а значение не выполненной итерации. Обратите внимание, что j++ увеличивается во время последней итерации.

Я бы посоветовал вам объявить счетчик l oop только в области действия l oop, чтобы избежать путаницы, подобной текущей:

for (int j = 0; j < n; j++){
    //...
}
0 голосов
/ 28 февраля 2020

Условие l oop гласит: «Делайте все это, пока я меньше или равен n, и увеличивайте i после каждого раунда».

Таким образом, l oop проверяет условие, выполняется один раз, затем увеличивает i. Во втором и последнем раунде условие будет выполнено, код будет выполнен, а затем i будет увеличен. В последнем раунде условие больше не выполняется, и затем код не выполняется и i не увеличивается, но к настоящему времени он уже выше, чем вы ожидаете, что он будет

0 голосов
/ 28 февраля 2020

потому что тест "i <= n" не удался, когда мне стало 6. Поэтому после l oop i == 6. </p>

...