is an excellent book (isbn 0-470-84573-2). As usual I'm going to quote from a few pages:
Except when it is the operand of the sizeof operator, the unary & operator, the ++ operator, the -- operator, or the left operand of the . operator or an assignment operator an value that does not have an array type is converted to the value stored in the designated object (and is no longer an lvalue). (6.3.2.1 Lvalues, arrays, and function designators)
object: region of data storage in the execution environment, the contents of which can represent values. (3.14 Terms, definitions, and symbols)
Between the previous and next sequence points an object shall have its stored value modified at most once by the evaluation of an expression. (6.5 Expressions)
At certain specified sequence points, al side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place. (5.1.2.3 Program execution)
If a "shall" or "shall not" requirement that appears outside of a constraint is violated, the behaviour is undefined. (4. Conformance)
A conforming program is one that is acceptable to a conforming implementation. (4. Conformance)
implementation: particular set of software, running in a particular translation environment under particular control options, that performs translation of programs for, and supports execution of functions in, a particular execution environment. (3.12 Terms, definitions, and symbols)
A full expression is an expression that is not part of another expression or declarator… The end of a full expression is a sequence point. (6.8 Statements and blocks)