On Wednesday, 2 April 2014 at 08:50:17 UTC, Johannes Pfau wrote:
Am Wed, 02 Apr 2014 07:47:23 +0000
schrieb "Sarath Kodali" <sar...@dummy.com>:
On Tuesday, 1 April 2014 at 22:04:43 UTC, Timon Gehr wrote:
> On 04/01/2014 08:40 PM, Sarath Kodali wrote:
>> ...
>>
>> The evaluation order of assign operators should not be LTR
>> as they have
>> right associativity. In "a = b = c", c has to be evaluated
>> first, then b
>> and then a. Similarly, in "a = b + c", "b+c" has to be
>> evaluated first
>> before a is evaluated. Otherwise it will be very confusing,
>> that in some
>> cases it is LTR and in some it is RTL.
>
> Note that this is after a paragraph that suggests to make
> evaluation in some cases LTR and in some RTL.
>
There are 2 evaluation orders that need to be considered while
evaluating expressions - the evaluation order of operators and
the the evaluation order of operands of an operator. The
evaluation order of operators is well defined and is done
according to its precedence and associativity. However the
evaluation order of operands for some of the binary operators
is not defined. D left it undefined for assign operator. So in
"a=b", the compiler can choose to evaluate a first and then b.
However in "a=b=c", "b=c" has to be evaluated first due to
right associativity of '=' operator. Similarly in "a=b+c",
"b+c" has to be evaluated first due to higher precedence of +
operator over = operator. In both these cases, the right
operand of = operator is evaluated first and then the left
operand. So it naturally follows that even in the unspecified
case (a=b), the right operand should be evaluated first so
that it is consistent with other cases of = operator. All this
means, the evaluation order of operands also should be
according to the associativity of its operator. You can test
this with other right or left associative binary operators.
In a=b=c you have to do assignment b=c first, then assign a=b.
But we're
talking about _side effects_ here, i.e. a() = b() = c(). And
you can
evaluate the side effects in LTR order:
a() = b() = c();
==>
auto tmp1 = &a();
auto tmp2 = &b();
*tmp2 = c();
*tmp1 = *tmp2;
http://dpaste.dzfl.pl/19c118b7d368
Once the evaluation order of an operator is defined, it should be
consistent in all the cases. Otherwise it will be very confusing
to the programmer.
- Sarath