D Logic bug

Jonathan M Davis newsgroup.d at jmdavisprog.com
Thu Oct 11 21:57:00 UTC 2018


On Thursday, October 11, 2018 1:09:14 PM MDT Jonathan Marler via 
Digitalmars-d wrote:
> On Thursday, 11 October 2018 at 14:35:34 UTC, James Japherson
>
> wrote:
> > Took me about an hour to track this one down!
> >
> > A + (B == 0) ? 0 : C;
> >
> > D is evaluating it as
> >
> > (A + (B == 0)) ? 0 : C;
> >
> >
> > The whole point of the parenthesis was to associate.
> >
> > I usually explicitly associate precisely because of this!
> >
> > A + ((B == 0) ? 0 : C);
> >
> > In the ternary operator it should treat parenthesis directly to
> > the left as the argument.
> >
> > Of course, I doubt this will get fixed but it should be noted
> > so other don't step in the same poo.
>
> In c++ the ternary operator is the second most lowest precedence
> operator, just above the comma.  You can see a table of each
> operator and their precendence here, I refer to it every so
> often:
> https://en.cppreference.com/w/cpp/language/operator_precedence
>
> Learning that the ternary operator has such a low precedence is
> one of those things that all programmers eventually run
> into...welcome to the club :)
>
> It looks like D has a similar table here
> (https://wiki.dlang.org/Operator_precedence).  However, it
> doesn't appear to have the ternary operator in there. On that
> note, D would take it's precedence order from C/C++ unless
> there's a VERY good reason to change it.

The operator precedence matches in D. Because in principle, C code should
either be valid D code with the same semantics as it had in C, or it
shouldn't compile as D code, changing operator precedence isn't something
that D is going to do (though clearly, the ternary operator needs to be
added to the table). It would be a disaster for porting code if we did.

- Jonathan M Davis





More information about the Digitalmars-d mailing list