For all built in data types, zero is represented by a sequence of zero-value binary digits. Regardless of the width of the data type, all zeros, resolves to an arithmetic value of zero. The runtime start-up code does not zero-initialise individual variables, rather it zeros the entire block of memory in which the variables are instantiated.
By using zero, all float
, double
, int
, char
etc. have a value that can be compared to literal zero (0) and match. If you initialised with any other byte value (remember the block not the variables are initialised) the effective variable value would depend the data type (its width and representation).
Moreover zero-initialisation ensures that all pointers have a value NULL rather then some arbitrary and meaningless and possibly invalid address that would cause undefined behaviour if dereferenced.