So here's a bit of a geeky post, but not so terribly geeky that I'm hiding the bulk behind a cut link.
"true" and "false" are simple concepts, right? Different programming languages seem to have hugely different ideas of what they are:
In C, 0
is false, any other integer is true, and the coercion rules make a null pointer false, and any other pointer true. Anything else is a compile error.
C++ follows (inherits?) the C rule, and adds true
as things that are true and false.
In shell, 0 is a true exit value; any other exit value is false. Inside [ ]
, empty strings are false and other strings (such as "0"
) are true.
In Python, 0
, the empty string, empty tuples, list
s, and dict
s are all false. Anything else (such as the string '0'
) is true. (A note on 0.0
: they're both ==
according to python, and both false, but print differently. One can be turned into the other by multiplying by -1
In Perl, 0
, the empty string, and undef
are false, and since evaluation as a boolean imposes scalar context, an empty array or hash variable is also false. Anything else (including arrayref or hashref values to empty structures) is true. Note that because perl helpfully autoconverts like a $SOME_NOUN_HERE, the string "0"
are to perl identical to 0
, and therefore false. (hence the Perl idiom "0 but true"
) A full discussion of the quirks of perl around various representations of zero could probably fill a small book, but I'll note that other consequences are that the expression -0
is true, but -0.0
In Ruby, false
are false, anything else (including 0
, the empty string, and an empty Array
) is true.
, the empty string, false
are false. Anything else (such as an empty Array
, or empty Object
) is true.
In Java, (since the autoboxing introduced in Java 1.5) true
are true, false
are false, ((Boolean) null)
is a runtime exception, and anything else is a compile error.
In Haskell, True
is true, False
is false, and anything else is a compile error.Google Go
behaves like Java 1.4 or Haskell - true
is true, false
is false and anything else is a compile error.Scala
appears to behave the same way - true
is true and false
is false. Anything else (including an instance of RichBoolean
, or of java.lang.Boolean
) is a compile error.
In Common Lisp, nil
, aka the empty list, is false. Anything else - including 0
, the empty string or empty vector
s of other types - is true.