I have used such construct in C:
list->head = list->tail = NULL;
and now I consider whether this really mean what I suppose.
Neither of those is correct.
Since the simple assignment = operator is right-to-left associative, your expression is identical to:
=
list->head = (list->tail = NULL);
NULL is assigned to tail, and then tail, which has the value of a null pointer, to head.