On Jun 25, 11 02:44, Jimmy Cao wrote:


On Fri, Jun 24, 2011 at 1:28 PM, Andrej Mitrovic
<andrej.mitrov...@gmail.com <mailto: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.


Why can ints be so easily concatenated with strings in the first place?

Because 'int' is convertible to a 'dchar'. (I have a patch based on Value Range Propagation against this, but it breaks a lot of druntime and Phobos code.)

Reply via email to