Почему пустой строковый литерал рассматривается как истинный?
Почему это условие в этом коде true?
int main ( )
{
if ("")
cout << "hello"; // executes!
return 0;
}
Ответ 1
Условие считается "истинным", если оно оценивается ничем иным, кроме 0 *. "" представляет собой массив const char, содержащий один символ \0. Чтобы оценить это как условие, компилятор "распадает" массив на const char*. Поскольку const char[1] не расположен по адресу 0, указатель отличен от нуля и условие выполняется.
* Точнее, если он оценивает true после неявного преобразования в bool. Для простых типов это означает то же самое, что и ненулевое, но для типов классов вам необходимо определить, существует ли operator bool() и что он делает.
§ 4.12 из спецификации проекта С++ 11:
4.12 Логические преобразования [conv.bool]
Значение арифметики, неперечисленное перечисление, указатель или указатель на тип члена может быть преобразуется в prvalue типа bool. Нулевое значение, значение нулевого указателя, или значение указателя нулевого элемента преобразуется в значение false; любое другое значение преобразован в true. Значение prdue типа std:: nullptr_t может быть преобразовано к значению типа bool; результирующее значение false.
Ответ 2
Потому что "" распадается на char const*, а все непустые указатели оценивают до true, если или при преобразовании в логическое.
Ответ 3
Вероятно, вы, вероятно, пришли из такого языка, как PHP, где проверка обрабатывается по-разному:
php -r 'echo "X";if ("") echo "Y";'
Это будет печатать X, но не Y, потому что пустая строка не имеет значения.
Как указывали другие, в С++ это непузырный указатель, поэтому он оценивается как истинный.