In its deep history, the C language was defined by what the implementations did.  Only later was it standardized, with an attempt to permit existing implementations be viewed as conforming or easily updated to be.  Even decades later, though, the culture of developers tends to the view that something which has always worked in every important implementation should be allowed and continue to work in new implementations.  This is such an example.  Only a new generation of compiler writers are challenging this, trying to shift to a language-lawyer interpretation of the standards.