据我所知,NAN
可以分配给double
类型变量,但不一定分配给int
/size_t
是否还有方法使用NAN填充int
/size_t
类型的向量/矩阵?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
size_t nrows, ncols;
size_t *array;
} Matrix ;
size_t ncol = 5;
size_t nrow = 1;
void print_matrix(Matrix * matrix);
int main()
{
Matrix *mat1 = (Matrix *) malloc(sizeof(Matrix));
mat1->nrows = nrow;
mat1->ncols = ncol;
mat1->array = (size_t *) malloc(mat1->nrows * mat1->ncols * sizeof(*mat1->array));
if (mat1 == NULL)
{
printf("Could not allocate memory\n");
exit(EXIT_FAILURE);
}
else
{
mat1->nrows = nrow;
mat1->ncols = ncol;
mat1->array = (size_t *) malloc(mat1->nrows * mat1->ncols * sizeof(*mat1->array));
for (size_t row =0; row<mat1->nrows; row++)
{
for (size_t col =0; col<mat1->ncols; col++)
{
mat1->array[row * ncol + col] = NAN;
}
}
print_matrix(mat1);
free(mat1);
}
}
void print_matrix(Matrix * matrix)
{
for (size_t row =0; row<matrix->nrows; row++)
{
for (size_t col =0; col<matrix->ncols; col++)
{
printf("%zu ", matrix->array[row * ncol + col]);
}
printf("\n");
}
}
1条答案
按热度按时间5kgi1eie1#
据我所知,
NAN
可以[赋值]给double
类型变量正确。
NaN
是为基于IEEE-754的类型(如float
和double
)定义的特殊值之一。1但不一定是
int
/size_t
正确。
NaN
* 不是 * 为整型int
或size_t
定义的值。你不能把
NaN
存储在整型变量中,原因和你不能把3.14存储在整型变量中一样,只是它不是整型类型可以保存的值之一。(One在编程中,data type的正式定义之一是它是一组值,以及对这些值的一组操作。对于
float
和double
类型(但仅限于这些类型),NaN
是其中一个值。实际上,有多个NaN
值,但那是另一回事。)对于浮点类型,
NaN
是sentinel values,定义良好的“非值”值。有些类型有标记值,有些没有。例如,对于指针类型,NULL
是标记“非有效指针”值。在C字符串中,空字符\0
是标记字符串结束的标记值。另一方面,当你调用getchar
时,EOF
是“非字符”值(但是这并没有使EOF
成为char
类型的标记值,因为EOF
不是char
类型的值)。但是对于任何其他整型类型,都没有预定义的标记值,就像在真实的程序中使用整型一样,没有一个值可以保留为标记,而这个值可能不是有效值。
如果你有一个整型变量,并且你需要一个标记值,你需要定义一个你自己的标记值。例如,如果你知道你的值总是正的,你可以使用-1作为标记值。但这充其量只是一个约定:值-1不会被语言或CPU特殊处理--它只是另一个整数值。
浮点和指针类型有标记值是件好事,而其他类型没有标记值有时会很麻烦。当试图为其他类型定义标记值时,必须使用的 ad hoc 约定经常会导致各种麻烦。为了使
EOF
作为getchar
的标记值,程序员必须记住always storegetchar
's return value in a variable of typeint
。而不是char
。像read
这样的函数返回读取的字符数,或者返回-1表示错误,很难为其定义一个好的返回类型,因为它必须有符号才能容纳-1,否则可能是无符号的。2函数mktime
将分解的时间结构转换回整数time_t
值,对于错误,返回-1,这意味着您无法明确地判断是否出现错误,或者是否成功转换了1969年12月31日23:59:59的时间。脚注1:类型
float
和double
并不一定基于C语言中的IEEE-754定义,但在当今的大多数系统上,它们都是。脚注2:我相信这就是为什么
read
被定义为返回ssize_t
类型的值,并且我相信ssize_t
类型是“有符号的size_t
“,或者换句话说,“一个本来是无符号的值,就像size_t
一样,除了它必须有符号才能返回-1”。