Инкремент для условия l oop - PullRequest
3 голосов
/ 03 марта 2020

При просмотре исходного кода Linux я наткнулся на следующую строку :

int tmp;    
for (tmp = PIDTYPE_MAX; --tmp >= 0; )

Почему бы не сделать:

for (tmp = PIDTYPE_MAX; tmp >= 0; tmp--)

Это другой вид для оптимизации l oop?

Ответы [ 2 ]

5 голосов
/ 03 марта 2020

Ваши циклы не эквивалентны: второй l oop включает верхнюю границу PIDTYPE_MAX, первый - нет.

Уменьшение переменной итератора до того, как тело l oop гарантирует, что условие 0 <= tmp < PIDTYPE_MAX всегда верно в l oop. На самом деле это каноническое обратное l oop в C, где нижние границы являются включающими, а верхние - исключительными.

Обратите внимание, что для первого l oop требуется целое число со знаком, так что тест на tmp >= 0 имеет смысл. (Это всегда будет верно для целых чисел без знака.)

Типы без знака, такие как size_t, часто используются для индексов и счетчиков массива, которые не могут быть отрицательными. Соответствующие петли:

for (size_t i = 0; i < N; i++) ...     // iterate over [0, N) forwards
for (size_t i = N; i-- > 0; ) ...      // iterate over [0, N) backwards
0 голосов
/ 03 марта 2020

В первом случае значение temp будет уменьшено перед вводом в l oop. В то время как во втором случае значение temp будет уменьшаться после выполнения l oop body.

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