Sequence Points in C and C++
In C and C++, sequence points occur in the following places. (In C++, overloaded operators act like functions, and thus operators that have been overloaded introduce sequence points in the same way as function calls.)
- Between evaluation of the left and right operands of the && (logical AND), || (logical OR) (as part of short-circuit evaluation), and comma operators. For example, in the expression
*p++ != 0 && *q++ != 0
, all side effects of the sub-expression*p++ != 0
are completed before any attempt to accessq
. - Between the evaluation of the first operand of the ternary "question-mark" operator and the second or third operand. For example, in the expression
a = (*p++) ? (*p++) : 0
there is a sequence point after the first*p++
, meaning it has already been incremented by the time the second instance is executed. - At the end of a full expression. This category includes expression statements (such as the assignment
a=b;
), return statements, the controlling expressions ofif
,switch
,while
, ordo
-while
statements, and all three expressions in afor
statement. - Before a function is entered in a function call. The order in which the arguments are evaluated is not specified, but this sequence point means that all of their side effects are complete before the function is entered. In the expression
f(i++) + g(j++) + h(k++)
,f
is called with a parameter of the original value ofi
, buti
is incremented before entering the body off
. Similarly,j
andk
are updated before enteringg
andh
respectively. However, it is not specified in which orderf
,g
,h
are executed, nor in which orderi
,j
,k
are incremented. Variablesj
andk
in the body off
may or may not have been already incremented. Note that a function callf(a,b,c)
is not a use of the comma operator and the order of evaluation fora
,b
, andc
is unspecified. - At a function return, after the return value is copied into the calling context. (This sequence point is only specified in the C++ standard; it is present only implicitly in C.)
- At the end of an initializer; for example, after the evaluation of
5
in the declarationint a = 5;
. - Between each declarator in each declarator sequence; for example, between the two evaluations of
a++
inint x = a++, y = a++
. Note that this is not an example of the comma operator.
Read more about this topic: Sequence Point
Famous quotes containing the words sequence and/or points:
“Reminiscences, even extensive ones, do not always amount to an autobiography.... For autobiography has to do with time, with sequence and what makes up the continuous flow of life. Here, I am talking of a space, of moments and discontinuities. For even if months and years appear here, it is in the form they have in the moment of recollection. This strange formit may be called fleeting or eternalis in neither case the stuff that life is made of.”
—Walter Benjamin (18921940)
“Wonderful Force of Public Opinion! We must act and walk in all points as it prescribes; follow the traffic it bids us, realise the sum of money, the degree of influence it expects of us, or we shall be lightly esteemed; certain mouthfuls of articulate wind will be blown at us, and this what mortal courage can front?”
—Thomas Carlyle (17951881)