In xcat(x,y), the x and y are not adjacent to the ## operator, and
so they undergo macro expansion before being substituted.
So x is identified as xcat(1,2) and y is identified as 3. But prior
to substitution, x is macro-expanded to cat(1,2), which turns into 1##2
which turns into 12. So ultimately, xcat(xcat(1,2),3) will expand
to cat(12,3), which will turn out 123.
This Works --> cat(xcat(1,2),3) --> cat(cat(1,2),3) --> cat(12,3)
The behavior is well-defined because all of the token pastings
result in valid preprocessor tokens i.e any expanded xpression should be a valid token at any stage.