Возвращает ли NAN значение false при доступе через указатель?

Я пишу функцию, которая возвращает указатель на массив чисел. Чтобы иметь возможность перебирать числа с помощью указателя, я установил последний элемент в NAN чтобы отметить конец массива.
Моя петля была что-то вроде

for(int* it=ptr;!isnan(*it);++it)
//print *it

но он продолжал работать, пока не рухнул, поэтому я написал тестовый код:

int* test = new int[1];
*test = NAN;
cout << isnan(NAN) << endl;
cout << isnan(*test) << endl;

И результат был:

1
0

Я видел много примеров использования NAN как «пробка» в массивах. Так почему это не работает?

0

Решение

У вас неопределенное поведение, потому что вы пытаетесь конвертировать NAN, который имеет тип с плавающей запятой, к int и это значение не может быть представлено int,

§4.9 / 1 [conf.fpint] Значение типа с плавающей точкой может быть преобразовано в значение типа целого числа. Усечение преобразования; то есть дробная часть отбрасывается. Поведение не определено, если усеченное значение не может быть представлено в типе назначения.

поскольку NAN это просто специальное значение чисел с плавающей запятой, не имеет смысла хранить его в int, Целочисленные типы не имеют специального не числового значения. Вы мог используйте определенное значение для обозначения конца массива, но это не особенно приятное решение.

Если вы собираетесь динамически распределять свой массив таким образом, вам придется отслеживать его размер самостоятельно, передавая его по кругу. Для других массивов (где у вас есть нечто, обозначающее сам объект массива, а не просто указатель на его элементы), вы можете использовать std::end чтобы найти конец этому. Однако, как обычно, я предлагаю вместо этого использовать стандартные контейнеры.

5

Другие решения

isnan() работает только с плавающей точкой.

2

По вопросам рекламы [email protected]