dmd-2.067.0-b1

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Feb 13 07:43:53 PST 2015


On 2/13/15 9:01 AM, anonymous wrote:
> On Friday, 13 February 2015 at 13:25:55 UTC, Steven Schveighoffer wrote:
>> Yes, the operator precedence (curiously not defined in the spec) is here:
>>
>> http://wiki.dlang.org/Operator_precedence
>>
>> Conditional operator is above assignment operators.
>
> It's specified through the grammar [1]:
>
> ----
> AssignExpression:
>      ConditionalExpression
>      ConditionalExpression = AssignExpression
>      [...]
>
> ConditionalExpression:
>      OrOrExpression
>      OrOrExpression ? Expression : ConditionalExpression
> ----
>
> The third operand of ConditionalExpression cannot be an AssignExpression
> without parentheses.
>
> So `foo ? bar : baz = qux` can only be interpreted as `(foo ? bar : baz)
> = qux`.
>
> [1] http://dlang.org/expression.html

Right, but C++ seems to treat it differently, but has the same order of 
precedence. It seems that C++ can do lvalues as a result of assignment, 
but for some reason it doesn't do the same as D.

Indeed, if you do:

(a < 10) ? 5 : a = 1;

In D, this results in an error, in C++, this just results in the rvalue 5.

OK, so I just looked for more information, and found that in some 
references, the ?: is given the same precedence as the assignment 
operator (and ordered right to left), which would explain the behavior. 
So likely the wikipedia reference is just wrong.

e.g.: http://en.cppreference.com/w/cpp/language/operator_precedence

Walter (or other language gurus), any reason that D does it this way? 
The C++ way seems more natural to me.

-Steve


More information about the Digitalmars-d-learn mailing list