通过指针访问时NAN是否返回false?

时间:2014-01-16 15:16:00

标签: c++ pointers nan math.h

我正在编写一个返回指向数组数组的指针的函数。为了能够使用指针迭代数字,我将最后一个元素设置为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作为“塞子”的例子。那为什么不起作用?

2 个答案:

答案 0 :(得分:5)

您有未定义的行为,因为您尝试将NAN(浮点类型)转换为int,并且该值无法由int表示。

  

§4.9/ 1 [conf.fpint] 浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。

由于NAN只是浮点数的特殊值,因此将它存储在int中是没有意义的。整数类型没有特殊的非数字值。你可以使用一些特定的值来表示数组的结尾,但这不是一个特别令人愉快的解决方案。

如果您要像这样动态分配数组,则必须通过传递它来自己跟踪它的大小。对于其他数组(您实际上有一些表示数组对象本身的东西,而不仅仅是指向其元素的指针),您可以使用std::end来查找它的结尾。但是,像往常一样,我建议使用标准容器。

答案 1 :(得分:2)

isnan()仅适用于浮点。