Actually, // is not a postfix operator, itself; it would be considered an infix operator, akin to + or -. It operates by turning x // f into f[x]. You can string several of them together, e.g. x // f // g which is equivalent to g[f[x]], and think of them as successive transformations. This can be very useful for crafting complex transformations, but it does make for very opaque code. Nowadays, I tend to create many functions and layer them to create the effects which makes my code a bit easier to follow. Similarly, there is the prefix form f @ x which is operationally equivalent to x // f.
As pointed out in Michael's answer, the entire left hand side (LHS) must be considered as the argument to the right hand side (RHS) which usually works. There are cases where it will not, but that depends on the precedence of the operators used on the LHS. For most cases, there is nothing to worry about as // has a relatively low precedence, but consider the following
f = x // g
The Set operator (=) has a lower precedence than //, so the above is equivalent to
f = g[x]
\begin{Edit}
Additionally, mixing operators with higher precedence can cause some confusion. For instance, the following
m // p + q // n
is interpreted as
n[ (p + q)[m] ]
which is not likely what you would want, so parentheses should be used, such as
(m // p) + q // n
(* n[q + p[m]] *)
or
(m // p) + (q // n)
(* n[q] + p[m] *)
depending on what you want.
It is interesting to note that the function operator (&) which turns the preceding into a pure function has a low precedence relative to most operators, but a higher precedence than //. So, this
m // p + q& // n
is interpreted as
n[ Function[ p + q ][m] ]
or
n[ p + q ]
if neither p nor q are slots.
\end{Edit}
Part ([[i]]), on the other hand, has a high precedence, so it will take effect prior to //, and it can be considered a postfix operator, also. In other words, it effects the output from FullSimplify prior to N being applied. Rewriting the code as it is interpreted, you get
N[ Part[ FullSimplify[ Solve[ ... ] ], 1 ] ]
But, I am partial to using the prefix form here
N @ FullSimplify[ ... ][[1]]
or, possibly more clearly
N @ First @ FullSimplify[ ... ]
as the intent of the code is clarified a bit by letting the user know they will be getting a numerical result up front. The shift to using First instead of Part[..., 1] only further clarifies what is occurring. The downside to this construct, as opposed to the postfix form, is it can be more difficult to add additional transformations while keeping them straight in your mind. For the so inclined, here is the full postfix form
FullSimplify[ ... ] // First // N
or, how I would write it
Solve[ ... ] // FullSimplify // First // N
Lastly, while N can be used to specify numerical precision, I primarily use it to convert from analytic numbers to numerical numbers. For instance, Mathematica is perfectly happy to work with 1/3, but sometimes I need a numerical answer. So, I use N to perform the conversion.
expr1 // N + expr2 // N, assuming it's similar toN@expr1 + N@expr2– rm -rf Jan 06 '13 at 18:27ref/Postfixstates: "Postfix[f[expr]]prints withf[expr]given in default postfix formexpr // f." [emph added] (Sorry, the formatting here is getting messed up and does not seem to appear the way the help says it should.) – murray Jan 06 '13 at 20:12//itself. Also, if you read the docs a little closer, you'll note thatPostfixdisplays the postfix form off, but it says nothing about//, directly. Based upon how it works, the action of//must be interpreted as a binary (or infix) operator. – rcollyer Jan 06 '13 at 20:22//as an infix operator, since it takes both a left an a right argument. On the other hand, the use of "postfix" helps distinguish it from normal prefix placementf[x](orf@x) and infix placement for a 2-argument functionx ~f~ y. Both descriptions "postfix" and "infix" could therefore be justified. – murray Jan 07 '13 at 00:47//. And, while it is the postfix operator, I felt the infix semantics were what he was missing. – rcollyer Jan 08 '13 at 03:37