Some features of C, its preprocessor, and/or implementation are inconsistently implemented. One of C's features is three distinct classes of non-wide string literals. One is for programsrun-time data, oneanother is for include files with quotation marks around the filename, and the third is for include filenames in right angle brackets. The allowed symbol set, and the interpretation of them, is not consistent between the three. To some extent this arose from the need to accommodate a wide variety of file naming conventions, such as [[MS-DOS]]'s use of backslash as a path separator.
Another consistency problem stems from now-standardized shortcomings in C's preprocessor, which was originally implemented as a separate, relatively simple, process only loosely connected with the semantics of the rest of the language. The following code is legal Standard C:
int sixteen = 0x3e-0x2e;
Unfortunately, ana ANSIStandard C preprocessor will readsconvert "0x3e-0x2e" asto a single "preprocessor number"preprocessing token, and the subsequent conversion of that to a token in a later phase of translation is ill-defined, so the compiler willmight not obtain the correctintended tokenization of
int sixteen = 0x3e - 0x2e ;
even though spaces around the minus sign arewould not requiredotherwise bybe the languagerequired.