未定义行为
序列点 Sequence points
在相邻的两个序列点之间,一个对象只允许被修改一次,而且如果一个对象被修改则在这两个序列点之间只能为了确定该对象的新值而读一次。
C99(ISO/IEC 9899:201x)规定的序列点
The following are the sequence points described in 5.1.2.3:
—The call to a function, after the arguments have been evaluated (6.5.2.2).
—The end of the first operand of the following operators: logical AND && (6.5.13); logical OR || (6.5.14); conditional ? (6.5.15); comma , (6.5.17).
—The end of a full declarator: declarators (6.7.5);
—The end of a full expression:
an initializer (6.7.8);
the expression in an expression statement (6.8.3);
the controlling expression of a selection statement (if or switch)(6.8.4);
the controlling expression of a while or do statement (6.8.5); each of the expressions of a for statement (6.8.5.3);
the expression in a return statement(6.8.6.4).
—Immediately before a library function returns (7.1.4).
—After the actions associated with each formatted input/output function con version specifier (7.19.6, 7.24.2).
—Immediately before and immediately after each call to a comparison function, and also between anycall to a comparison function and anymovement of the objects passed as arguments to that call (7.20.5).