From the pstricks documentation (section 54 Special coordinates, p 145):
(!ps) Raw PostScript code. ps should expand to a coordinate pair.
The units xunit and yunit are used. For example, if we want to use
polar coordinates (2, 45) and (1.5, 70) that are scaled along with
xunit and yunit, we can write:
\SpecialCoor
\psset{dotscale=2,xunit=2,yunit=1.5}%
\psdot(2;45)
\psdot[linecolor=cyan](! 2 45 cos mul 2 45 sin mul)
\psset{dotstyle=triangle*}%
\psdot(1.5;70)
\psdot[linecolor=cyan](! 1.5 70 cos mul 1.5 70 sin mul)
A lot of things can be done with some PostScript programming, and
sometimes in an easiest way than at the TeX level. Note also that some
PostScript code can be executed in addition to the computation of the
coordinates.
Note there are no commas that separate the coordinates!
So following a call to \SpecialCoor, the notation (! <stuff>) denotes a PostScript interface to setting coordinates. And, PostScript uses a Reverse Polish notation (RPN) approach to push/pop content onto a stack. In laymen's terms, this means that (using infix notation) 3 − 4 + 5 is transformed to 3 4 − 5 + in RPN - you first specify the operands, then the operator that acts on these operands. Specific to your example, the coordinate pair passed to the PostScript compiler requires the two top entries to resemble your (X,Y) pair. If you push an X value, followed by a comma ,, followed by a Y value, the PostScript compiler probably sees , as the X value, which doesn't make sense.
For a detailed discussion on the PostScript Language (extensively used by pstricks in the background), see the PostScript Language Reference Manual. In particular, you should read the chapter on operators (Chapter 8: Operators, p 505).
In sequence, \pnode(!0 2 add 0 2 add){C} has the following PostScript sequence:
0 is pushed on the stack (stack: 0)
2 is pushed on the stack (stack: 0 2)
add takes the first two entries on the stack and replaces it with the sum (stack: 2)
0 is pushed on the stack (stack: 2 0)
2 is pushed on the stack (stack: 2 0 2)
add takes the first two entries on the stack and replaces it with the sum (stack: 2 2)
As mentioned in the pstricks documentation, it is possible to do quite a bit on the PostScript side (for example, read any of the .pro files associated with pstricks). You may be required to understand PostScript if you wish to update certain pstricks functionality yourself.