Listing is an explicit compiler statement that you want to override the default implicit type conversions (or taking into account their absence) that the language gives you. Generally speaking, these implicit type conversions by default are well thought out by the language developers and work with type C security, not against it.
A good example is void * , which according to section 6.5.16.1.1, C11 can be implicitly converted by assignment to a pointer or from a "pointer to any type of object". This means that you cannot, for example, implicitly convert it to a pointer to a function. This is exactly how you would like it to work when calling malloc() , for example, it must convert some other type of pointer, since you obviously cannot create objects of type void , but this makes no sense for dynamic allocating a memory block for a function. So, implicit type conversions by default here do exactly what you want - let you convert to a pointer to any type of object, since that is the whole goal, but complain loudly if you try to convert anything else.
Some people seem to think that dropping the return from malloc() makes it “explicit” what you are trying to do, but (1) you never see people who do things like int i = 1; double d = (double) i; int i = 1; double d = (double) i; They seem to make a special case of malloc() ; and (2) he doesn’t do this at all, because what the actor’s manifest does is that you want to override the default security types and conversions that C gives when what you really want to do in this case , comply with them.
As an alternative, sometimes implicit type conversions do not give you what you want, and casting should be necessary. An obvious example is integer division, which always gives you int . People who made C could provide another operator with floating point division with integers if they wanted to, but they didn't, the result is that if you want to do division with two integers and integer division, this is not what you want, then you have to drop one of them to a floating point type in order to override the default behavior in order to achieve what you want. If integer division is what you want in a particular case, then you obviously aren't using it.
So, as a rule, when C gives you the result that you want without casting, which in most cases fails. Only when used, when the default behavior of C does not give you what you want, and you are ready to explicitly give up the type of security that it gives you as a result.