Multiple assignment

Jonathan M Davis jmdavisProg at gmx.com
Fri Feb 25 23:32:00 PST 2011


On Friday 25 February 2011 22:32:47 Ali Çehreli wrote:
> On 02/25/2011 06:10 PM, Jonathan M Davis wrote:
> > On Friday, February 25, 2011 17:31:36 Ali Çehreli wrote:
> >> On 02/25/2011 05:09 PM, bearophile wrote:
> >>   >       int j;
> >>   >       int[2] y;
> >>   >       y[j] = j = 1;
> >> 
> >> I think that's undefined behavior in C and C++. It is not defined
> >> whether j's previous or past value is used in y[j].
> >> 
> >> I would expect the situation be the same in D.
> > 
> > No, that should be perfectly defined. What's undefined is when you do
> > something like func(j, y[j]). The evaluation order of the function
> > arguments is undefined. However,  the evaluation order when dealing with
> > an assignment should be defined. I _could_ be wrong about that, but
> > there's no question that the assignments themselves are guaranteed to be
> > done in right-to-left order.
> > 
> > - Jonathan M Davis
> 
> Standard texts are very difficult to read. I found a 2005 draft of the
> C++ standard. 5 Expressions, paragraph 4:
> 
> <quote>
> Except where noted, the order of evaluation of operands of individual
> operators and subexpressions of individual expres-
> sions, and the order in which side effects take place, is
> unspecified.58) Between the previous and next sequence point a
>   scalar object shall have its stored value modified at most once by the
> evaluation of an expression. Furthermore, the prior
>    value shall be accessed only to determine the value to be stored. The
> requirements of this paragraph shall be met for
>   each allowable ordering of the subexpressions of a full expression;
> otherwise the behavior is undefined. [ Example:
> i = v [ i ++]; / / the behavior is undefined
> i = 7 , i ++ , i ++; / / i becomes 9
> i = ++ i + 1; / / the behavior is undefined
> i = i + 1; / / the value of i is incremented
> — end example ]
> </quote>
> 
> To complete, footnote 58 is:
> 
> <quote>
> 58)
> The precedence of operators is not directly specified, but it can be
> derived from the syntax.
> </quote>
> 
> The section for the assignment operator does not mention anything to the
> contrary. According to my current understanding and my now-hazy
> recollections of old discussions on C++ news groups, in the following
> statement
> 
>    a() = b() = c();
> 
> the value of c() is assigned to b(), and the value of that expression is
> assigned to a(); but the order in which the three expressions are
> evaluated are unspecified.
> 
> Hence, if the code behaves contrary to 5.1 above, it has undefined
> behavior.
> 
> This was bearophile's statement:
> 
>    y[j] = j = 1;
> 
> The assignment operators do not introduce sequence points; there are
> only two: before and after the whole line above. The code does not obey
> "the prior value shall be accessed only to determine the value to be
> stored". Above, the prior value is used to determine which element of y
> is being assigned to.

Bleh. Well, good to know. Walter wants to make the order such evaluations 
ordered in D at some point though, so eventually it won't be a problem in D - 
though it'll obviously still be a problem in C++. Regardless, avoiding to alter 
a variable and use it multiple times within the same statement or expression is 
a good idea.

- Jonathan M davis


More information about the Digitalmars-d-learn mailing list