On Fri, 24 Jun 2011 14:28:45 -0400, Andrej Mitrovic <andrej.mitrov...@gmail.com> 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.

I can never remember precedence for ?:, so quite often I will over-parenthesize those expressions. I also typically over-parenthesize any expressions involving logical operations (i.e. & and |)

Rule of thumb -- minimal parentheses that establish order of precedence, even if unnecessary, don't ever hurt :)

But in any case, I'm really surprised "state is: " ~ false works at all... Since when can you append non-character types to strings? This is bound to result in bugs, since many people come from languages where appending a non-string type to a string results in a conversion to a string.

I'd expect "state is: " ~ false to result in "state is: false" if it compiles at all. This may not be a bug, but it probably warrants an enhancement. D goes through great pains to avoid automatic string conversion, I think it should reject any attempts at it, even if they are accidental.

-Steve

Reply via email to