TheBecause reasonANSI isC thatprovides support for [[Scientific_notation#E_notation|scientific notation]] support, <code>0x3ee-0x2e</code> matchesor the<code>e+</code> formis allowed as part of a [[Scientific_notation#E_notation|scientificnumber notation]]by "preprocessingthe number",preprocessor. and,sinceSince token-matching is greedy, <code>0x3e-0x2e</code> is converted to a single preprocessing token. The However, because of the mix of [[floating-point]] and [[hexadecimal]] notation, the subsequent conversion of that to a token in a later phase of translation is ill-defined. In this particular case, spaces around the minus sign must be added so the compiler will notcan obtain the intended tokenization of:
int sixteen = 0x3e - 0x2e;
even though spaceswhitespace aroundis the minus sign wouldnormally not otherwise be required.
In practice, this general problem arises most commonly in the context of [[C++]] [[Template (programming)|templates]], where multiple closing angle brackets are incorrectly tokenized as the [[bit shift|right-shift operator]].