What do you mean by "not really"? :-P
The poster's question is a classic comp.lang.c "favorite"; misunderstanding operator precedence and the two flavors of incrementing in C.
By the way, the term you're looking for is "binding", and bad languages have a habit of confusing binding and assignment.
LET "binds" its arguments to their corresponding values within its body, in a way identical to function application.
Algebraically his question looks like this:
f(x) -> x + succ(x)
y = f(10)
Where succ is the incrementing, or
successor function, and + is the addition function.
Btw, much fun can be had with just the increment and decrement functions, along with a predicate to test for zero equality.
http://en.wikipedia.org/wiki/Primitive_recursive_function
P.S. The Lisp "DO" form is for iteration; PROGN and BEGIN are the main block-structure forms used in Common Lisp and Scheme respectively. To the original poster; invest in learning Standard ML and a few lisp dialects, on your own, they will make your compiler hacking far more enjoyable, and you probably wont waste as much time debugging a bad language design from 1970s that thought formal language research from the 1670s was too cutting edge; New Jersey heard "Leibniz" and they thought "Lebanese".