Ключевой вопрос, который необходимо понять, заключается в том, что существует 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;
}
}
Тогда ясно, был ли тест когда-либо успешным.