An expression of type `void' is also an expression, but doesn't have
a value.
It can be argued (by carefully looking past the C standards

)
that an expression of type "void" has one possible value. If we
compare this with a single unsigned bit -- such as in a bitfield
-- which can have two different values, namely 0 and 1, we can
conclude that the single possible value of type "void" is probably
stored in *no* bits.
The next question that would arise is "what is this single value
of type void that any expression of type void has?" -- and the
answer is "it does not matter". Whatever that value is, all void
expressions have it, so there is no need to print or input them;
all we need to know is the type. Since we never need to printf
or scanf it, we do not need conversion specifiers; and although
C prohibits both:
void a, b; /* error -- objects a and b cannot have type void */
...
a = b; /* error -- cannot assign a value of type void */
one might argue that this *should* be allowed (though since a and b
use no storage, no code would be generated

).
Finally, to make it all work, we should initialize b first:
b = (void)0; /* or indeed (void)any_valid_expr */
which has the effect of converting the value to no bits, then assigning
no bits to the no-bit-storage-area named "b".
(This is not quite the way C does it, though. It might be nice
just for consistency, but note that sizeof(void) would be 0, which
brings up the whole "zero-sized objects" issue that Doug Gwyn
proposed handling for C89. He was unable to gather sufficient
interest and C ended up prohibiting zero-sized objects.)