Новичок для проблемы петли - PullRequest
0 голосов
/ 29 апреля 2009

[РЕДАКТИРОВАТЬ] К сожалению, в коде произошла ошибка, и теперь все ответы на вопрос кажутся странными, но в основном это был цикл for (i = 0; i <15; i ++). Я также отредактировал, чтобы сделать вопрос более понятным. [/ EDIT] </p>

Я пытаюсь создать цикл for, который проверяет массив из 16 элементов, поэтому он циклично переходит от 0 до 15. Затем я использую переменную i позже, однако иногда i == 16, что вызывает проблемы из-за отсутствия границ. .

У меня есть решение, но оно не выглядит элегантным, что заставляет меня думать, что я что-то упустил. Я пробовал циклы while, но я никогда не смогу заставить цикл переместиться от 0 до 15 и никогда не заканчивался значением больше 15.

Есть ли способ заставить цикл пойти и проверить все 16 элементов массива, не превышая 15 в конце цикла?

int i;

for(i=0; i<16; i++)
{
    someClass.someMethod(i);

    if(someClass.Test())
    {
        break;
    }
}



if (i == 16)
{
    i = 15;
}

Ответы [ 15 ]

0 голосов
/ 29 апреля 2009

Ключевой вопрос, который необходимо понять, заключается в том, что существует 17 различных ответов на вопрос «Какое значение i вызывает успешное прохождение теста?». Либо я могу быть в {0, 1, ..., 15}, либо никакое значение i не приводит к успешному выполнению теста, который в этом случае обозначается i == 16. Поэтому, если я ограничен только 16 значениями, на вопрос нельзя ответить.

Есть законные случаи, когда вы не хотите проходить мимо последнего действительного значения. Например, если у вас было 256 значений и по какой-то причине у вас есть только один байт для подсчета. Или, как недавно произошло со мной, вы хотите исследовать только каждый i-й элемент массива, и последнее добавление к вашему итератору уводит вас далеко за пределы конца массива. В этих случаях необходимо развернуть петлю .

Однако, для этой проблемы было бы чётче использовать флаг:

bool flag = false;
for (int i = 0; i < 15; ++i) 
{
    someClass.someMethod(i);

    if (someClass.Test())
    {
        flag = true;
        break;
    }
}

Тогда ясно, был ли тест когда-либо успешным.

0 голосов
/ 29 апреля 2009

Вы не можете сделать это с помощью встроенных структур цикла, и, как сказал Билл Ящер, вы, вероятно, не хотите использовать переменную for-loop повторно.

Но, если вы действительно хотите, вот способ сделать это. Хитрость заключается в том, чтобы поместить условие цикла в середину цикла:

int i = 0;
while (true)
{
    someclass.array[i];
    if (i == 15)
        break;
    ++i;
}
0 голосов
/ 29 апреля 2009

Технически существуют способы написания цикла, такие что i равен 15 при выходе из цикла, но вы не должны их делать:

int i = 0;
while (1) {
    someclass.someMethod(i);
    if (i < 15) {
        i++;
    } else {
        break;
    }
}

Да, он делает то, что вы просите. Но поток ужасен.

0 голосов
/ 29 апреля 2009

Цикл for эквивалентен следующему циклу while:

i = 0;
while(i < 16) {
    someClass.array[i];

    i++;
} // while

i должен достичь 16, чтобы правильно выйти из цикла.

0 голосов
/ 29 апреля 2009

Вы, должно быть, что-то пропустили.

В этом цикле он даже не достиг бы 15, вам нужно было бы сказать, что я <= 15, как только я = 14, он выполнил бы один раз и выручил. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...