2013-09-25 3 views
3
for (; cnt--; dp += sz) 
{ 
     pair_sanitize_struct(rec_id, ctx->api_mode, dp, FALSE); 
} 

Может ли кто-нибудь объяснить, как это работает для цикла? Он принадлежит файлу cpp. Я не понимаю условие в цикле for и как он проверяется. (Функция вызывается)Условие цикла (cpp)

ответ

2

Общий вид for заявления выглядит следующим образом:

for (init-statement; condition; expression) 
    statement 

init-statement используется для инициализации или присвоить начальное значение, который модифицирован в течение цикла. condition служит для управления контуром. Пока condition оценивает как истинный, выполняется statement. expression вычисляется для каждой итерации только если condition верно

Назад к коду:

for (; cnt--; dp += sz) 

init-statement здесь нулевое утверждение, что ничего не делает. condition - cnt-- который оценивает его значение как cnt, а затем уменьшает 1. Если cnt отличен от нуля, condition имеет значение true, если cnt равно нулю, condition является ложным.

+1

init-statement выполняется только один раз до начала цикла. условие проверяется для каждой итерации, и выражение оценивается для каждой итерации, только если условие истинно. – Jack

+1

@Jack. Или, скорее, условие проверяется перед каждым кругом в цикле и третьим выражением после каждого круга. Цикл for выполняется как: 'condition (stop if false) -> body loop -> 3rd expression'. – Lundin

0

В C++ значение для условия, являющегося истинным или ложным, определяется как non 0 (true) или 0 (false).

выше цикл будет продолжать итерации до тех пор, как CNT НЕ 0. прекращается, когда CNT становится 0.

UPDATE:

Чтобы очистить важный момент, это значение 0, что завершает петля. Если по какой-то причине cnt уже начинается с отрицательного значения, цикл никогда не заканчивается

+0

На самом деле, так как условие является выражением post-increment, оно завершается, когда 'cnt' становится' -1' (или недопустимо, если оно без знака). –

+1

@BenjaminLindley Нет, 'cnt' будет' -1' * после * цикла, но это все равно значение '0', которое заставляет цикл заканчиваться. –

+0

@JoachimPileborg: Это точно соответствует моему утверждению. –

1

Условие интерпретируется как истинный или ложный сценарий.

Если это 0, то это будет false, иначе true.

0

Помните, что нормальные целые числа также могут использоваться в качестве булевых значений, где ноль - false, а все ненулевые - true.

Это означает, что цикл будет продолжаться до тех пор, пока cnt не станет нулевой, а затем цикл завершится. Однако это не вся история, так как используется оператор пост-декремента, значение cnt после окончания цикла будет -1.

1

Это эквивалентно следующему коду -

for(; cnt-->0; dp += sz); 

Потому что до тех пор, как значение не равно 0, то считается, чтобы быть правдой.

+0

Я уважаю ответ как действительный. Но, конечно, использование -> не является обычным c (учитывая, что кто-то просто изучает язык как OP), вероятно, не известен многим программистам и, конечно же, не рекомендуется переносить и читать в вышеуказанной ситуации. – fayyazkl

+0

@fayyazkl Вы ссылаетесь на следующее: http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator? –

+0

да конечно. Без пространства большинство людей (включая меня, когда я увижу этот первый обратный путь назад), подумают, что это как новый оператор какого-то рода – fayyazkl

0

Он похож на

while(cnt--) 
{ 
     pair_sanitize_struct(rec_id, ctx->api_mode, dp, FALSE); 
     dp += sz; 
} 

надеюсь, что это полезно.

0

Так синтаксис для петли

for (<initialization(optional)>; <condition(Optional)>; <increment(Optional)>) 
{ 
    ... 
} 

Say для НКТ является 2 ваш цикл работает следующим образом,

for(; cnt--; dp+=size) 
    { 
     ... 
    } 

поток Казнь,

1. initialization statement will be executed once. Since you dont have one nothing will be executed 

2. Next condition statement will be executed. In your case cnt-- which result in cnt value is considered as condition result. So, if cnt is 2 then value 2 is considered as condition result. Hence all non-zero are considered as TRUE and zero is considered as FALSE. After evaluating to TRUE it decrements cnt by 1 

3. Once the condition results in TRUE then it executes the statement part say, pair_sanitize_struct(rec_id, ctx->api_mode, dp, FALSE); 

4. At the last it executes the increment statement of for loop,in you case it is dp-=size; 

5. It executes from 2 till condition evaluated to ZERO ie FALSE it comes out of loop. 
Смежные вопросы