Как остановить выполнение условия цикла while, если условие не выполнено - PullRequest
1 голос
/ 30 марта 2012

У меня есть цикл while с условием цикла:

while (i != repetitionString.Length || !repetitionString[i].Equals(')'))

Первая часть условия проверяет, что конец коллекции не достигнут.Возможно ли не выполнить часть, следующую за || после того, как условие левой стороны не будет выполнено?Причина этого заключается в том, что если условие левой стороны не выполнено, то это означает, что коллекция вышла за пределы, и, следовательно, оценка / проверка правой стороны вызовет исключение.

Возможно ли сделатьэто?

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

вы просто используете && вместо ||.Поскольку правильное условие должно быть проверено, только если первое вернуло true.

2 голосов
/ 30 марта 2012

Это то, что произойдет в любом случае - логическое условие справа всегда выполняется только в том случае, если левое условие оценивается как ложное. Вы можете принудительно сделать правильный выбор, используя двоичную логику (одиночную |), но это не совсем то, что вы хотите сделать, поэтому ваш текущий оператор будет выполняться просто отлично.

Похоже, что вы действительно хотите:

while (i < repetitionString.Length && repetitionString[i]!=")")
{

}
0 голосов
/ 30 марта 2012

Это выглядит эквивалентно:

if (attribute != null || attribute.value != null)

потому что вы не можете использовать

if (attribute.value != null) 

как это вызовет ошибку, когда атрибут == нуль, поэтому я думаю, что ваш код правильный?

При условии

i != repetitionString.Length

выполнено, код пропустит часть после ||

Поскольку это выражение ИЛИ, нет необходимости проверять вторую часть условия, когда первая часть условия возвращает значение true.

Когда вы используете && вместо ||, всегда будут проверяться оба условия. Это не то, что вы хотите сделать здесь.

0 голосов
/ 30 марта 2012

Короткое замыкание уже происходит.

Я предполагаю, что repetitionString - это индекс, начинающийся с нуля, а .Length возвращает общее количество.Поэтому вам нужно изменить if, чтобы он оставался в границах:

while (i != (repetitionString.Length - 1) || !repetitionString[i].Equals(')'))
...