Указатели и целые числа, а также логические значения, являются целочисленными типами .Первые три являются либо указателями, либо целыми числами, и, поскольку они не равны нулю, они преобразуются в логическое значение true
.Четвертое значение типа double
преобразуется в нулевое интегральное значение и, следовательно, false
.
Преобразование двойных чисел, которые не могут быть представлены в виде интегральных значений (таких как бесконечность и NaN), не определено.
Подробные сведения см. В 4.9, а также в разделе 4.12 для "Булевых преобразований":
Значение арифметического, перечисления с незаданной областью, указателя или указателя на тип элемента может быть преобразовано в значение типа bool.Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложь;любое другое значение преобразуется в true.
Ваш 0.0
является арифметическим типом нулевого значения.
Возможно, вы не знакомы со строковыми литералами в C ++: ""
обозначает массив char[1] { 0 }
, и этот массив (из одного элемента) превращается в указатель на его первый элемент, который обязательно является ненулевым указателем.Аналогично, «asdf» обозначает массив char[5] { 'a', 's', 'd', 'f', 0 }
, и снова это превращается в (ненулевой) указатель на его первый элемент.Фактическое значение символов совершенно несущественно.