2016-12-18 8 views
2

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

Я искал рекурсивный алгоритм сортировки (сортировка вставки). Код выглядел так:

void insertion_recursive(int array[],int size){ 
int i; 

if (size<=1) return; 

insertion_recursive(array,size-1); 

for(i=size-1;i;i--) 
    if(array[i]<array[i-1]) 
     swap(&array[i],&array[i-1]); 
    else 
     break; 
} 

Я понимаю, как работает код, но условие цикла сбивает с толку меня:

for(i=size-1 ; i ; i--) 

Что это значит? Просто оставить «i» без указания условия?

+3

Но * это * есть состояние! Также как 'if (i) ...' делает. – usr2564301

+1

'0' является« ложным », любое другое значение« true ». –

+0

_I понимаю, как работает цикл. - Если бы вы это сделали, вы бы не задали вопрос. Когда 'i' равно нулю, это неверно, иначе оно истинно. –

ответ

2

Выражение представляет собой единый элемент данных - обычно число. Выражение может состоять из одного объекта, такого как constant или variable, или может состоять из некоторой комбинации таких объектов, соединенных между собой одним или несколькими операторами. Выражения также могут представлять собой логические условия, которые либо true, либо false. Однако в C условия true и false представлены ненулевыми целыми значениями и нулевым целым числом соответственно. Несколько простых выражения приведены ниже:

a + b 
x = y 
t = u + v 
x <= y 
++j 

В вашем примере, i это выражение, значение которого является выражение-х l-value, которое в данном случае, это значение переменной i. Выражение будет оцениваться до true для ненулевых значений i и false, если значение i равно нулю.

Таким образом, for(i=(size-1); i ; i--) эквивалентен for(i=(size-1); i != 0; i--).

+0

Я вижу, условие оценивает true для ЛЮБОГО ненулевого значения ... Я не знал об этом. Так что это также должно работать: for (i = size-1; i> 0; i--) –

0

i сам по себе преобразован в булево, аналогично if (i) {...} или if (! i) {...}; целые числа считаются true, когда отличное от нуля и false, когда ноль.

Таким образом, for(i=size-1 ; i ; i--) эквивалентен for(i=size-1 ; i != 0; i--).

+0

Делает ли C преобразование вещей в логическое? –

+0

Это был риторический вопрос –

+0

'i' сам по себе НЕ преобразован в логическое. –

2

В C при попытке оценить условие все, что равно 0, является ложным, а все остальное - истинным.

Даже указатели обрабатываются одинаково. Постоянный NULL фактически определяется как 0. В C++ 11 мы, наконец, имеем null_ptr для безопасности типа.

В C нет логического типа, и в C++, если вы накладываете верны целочисленным вы получаете 1, и ложные забросы до 0.