Подтвердить что ты не робот

Почему пустой строковый литерал рассматривается как истинный?

Почему это условие в этом коде true?

int main ( )
{

   if ("")
      cout << "hello"; // executes!

   return 0;
}
4b9b3361

Ответ 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, потому что пустая строка не имеет значения.

Как указывали другие, в С++ это непузырный указатель, поэтому он оценивается как истинный.