Учитывая стандартный связанный список, где «яблоки» - это список со свойствами (-> first и -> last), а «яблоко» - это элемент этого списка со свойством (-> next). Как работает этот цикл?
typedef struct
{
list_element header;
int value;
} apple;
int main()
{
list apples;
apple * a = (apple *) malloc(sizeof(apple));
apple * b = (apple *) malloc(sizeof(apple));
apple * c = (apple *) malloc(sizeof(apple));
a->value = 1;
b->value = 2;
c->value = 3;
list_init(&apples);
list_push_back(&apples, &a->header);
list_push_back(&apples, &b->header);
list_push_back(&apples, &c->header);
for (a = (apple *) list_begin(&apples); a; a = (apple *) list_next(&a->header)) { printf("%d\n", a->value); }
Как работает этот цикл? Функция list_begin просто возвращает -> первое из яблок. ; A; как говорит условный оператор, если не 0, то продолжить цикл for? а последняя часть указывает на следующий элемент в цикле. Итак, когда последним значением цикла является a = 0, что завершит цикл for?
Имеет ли это смысл?
Да ... Второй аргумент for сбивает с толку, что-то вроде a != NULL подойдет лучше
Отличное спасибо, ребята. Это подвешивало меня, потому что это было в каком-то коде, и я не мог понять, почему он завершился. Я не был уверен, завершил ли C цикл for, где средний оператор равен "0"
В C 0 - ложь, любое другое значение - истина. Цикл повторяется до тех пор, пока тест верен.





Документация для поможет вам:
for ( init_clause ; cond_expression ; iteration_expression ) loop_statementExplanation
Behaves as follows:
... cond_expression is evaluated before the loop body. If the result of the expression is zero, the loop statement is exited immediately.
В вашем случае cond_expression - это просто a, и когда a равен нулю (или NULL в случае указателя), цикл завершается.
Цикл for предназначен для перехода от первого узла к последнему узлу (до тех пор, пока) он не найдет NULL (его для обхода всего связанного списка).
Первый параметр: a = (apple *) list_begin(&apples) помещает a в начало этого списка.
Второй параметр: a - это условие, и оно нарушается при достижении одного за последним узлом, так как это будет NULL.
Параметр жажды: a = (apple *) list_next(&a->header) предназначен для просмотра списка.
да. В чем твоя проблема? Что заставляет вас сомневаться в своей интерпретации?