2011-12-31 2 views
1

Если я хочу использовать цикл какпри использовании NSUInteger в убывающей цикл, как определить,> = 0

for (NSUInteger row = 10; row >= 0; row--) { 
    // do something 
} 

, как это обойти тот факт, что ряд всегда будет> 0, так что это unsigned integer. Получается ли средняя конструкция петли for:

for (NSUInteger row = 10; row; row--) { 

} 
+1

Почему бы не использовать NSInteger? – MByD

+0

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

ответ

6

Если вы используете NSInteger вместо NSUInteger это становится немного проще. Поскольку NSInteger является знаковым целочисленным типом, вызов оператора декремента (--) на переменном с нулевым значением изменяет значение -1, так что вы можете проверить это с помощью простого сравнения:

for (NSInteger row = 10; row >= 0; row--) { 
    // do stuff with row 
} 

Если у вас есть для использования NSUInteger по какой-либо причине, то вызов оператора декремента переменной с нулевым значением приведет к тому, что значение переменной обернется до максимально возможного значения для NSUInteger. Вы можете проверить это, используя NSUIntegerMax.

for (NSUInteger row = 10; row != NSUIntegerMax; row--) { 
    // do stuff with row 
} 
0

Вам нужна неподписанная? Если это так, вам придется придумать тест, который сделает то, что вы хотите. Возможно, row> = 0 & & строка < = 10, хотя это немного неудобно для моих вкусов.

Редактировать: Просто хотел добавить, что сравнение unsigned> = 0 является излишним, но если вы собираетесь придерживаться unsigned, я бы оставил его, потому что он по крайней мере передает намерение.

+0

«Я бы оставил это, потому что он по крайней мере передает намерение». Он также дает предупреждение о компиляторе, поэтому его следует удалить. (Если вы оставите свой код, замусоренный конструкциями, генерирующими «неуничтожимые» предупреждения компилятора, у вас будет меньше шансов обнаружить новые, потенциально более важные предупреждения, когда они появятся.) –

+0

Ну, если мы действительно говорим о том, что я * Я бы не использовал эту конструкцию для начала. Если бы мне было запрещено использовать без знака здесь, я бы все же указывал диапазон явно, а не полагался на неидомные конструкции, например, по сравнению с 'NSUIntegerMax'. Я не согласен с тем, что весь код, приводящий к предупреждению, нужно изменить - если это так, они могут также быть ошибками. – huskerchad

0

Вы должны либо сделать это:

for (NSUInteger row = 10; row >= 1; row--) { 
} 

или это:

for (NSInteger row = 10; row >= 0; row--) { 
} 
0

Если вам действительно нужно использовать NSUInteger

for (NSUInteger row = 10; row >= 0; row--) { 
    // do something 
    if(row == 0) {break;} 
} 

В противном случае, попробуйте использовать NSInteger, как Саймон Whitaker предложил

0

Другой трюк заключается в перемещении декремент проверить состояние части. Кстати, этот цикл на одну операцию меньше, чем классический.

for (NSUInteger i = 10; i-- > 0;) 
{ 
} 
Смежные вопросы