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