On 2011-06-24 11:28, Andrej Mitrovic wrote: > import std.stdio; > > void main() > { > bool state = false; > writeln("state is: " ~ state ? "true" : "false"); > } > > writes: > true > > Whoa, what happened? Well, this should explain things: > > bool state = false; > auto str = "bla" ~ state; > > What (I assume) happens is the state boolean is converted to an int, > and since chars are ints in disguise and interchangeable you can > concatenate them with strings. > > So the original code acted like it was written like this: > bool state = false; > writeln(("state is: " ~ state) ? "true" : "false"); > > And what we wanted was this: > bool state = false; > writeln("state is: " ~ (state ? "true" : "false")); > > Anyway I just wanted to share how forgetting parens can introduce bugs in > code.
The ternary operator has _very_ low precedence. I believe that the various assignment operators, throw, and the comma operator are the only operators with lower precedence. So, almost in all cases, _everything_ to the left of a ternary operator is evaluated before the ternary. So, unless it's by itself (like on the right-hand side of an assignment or as the argument to a function), you pretty much always want to put parens around it. - Jonathan M Davis