C中的“-1L”是什么?

C中的“-1L”,“1L”等是什么意思?

例如,在ftell参考中,它说

…如果发生错误,则返回-1L …

这是什么意思 ? 什么是“1L”?

如果发生错误,为什么不返回NULL?

L指定数字是long类型,因此-1Llong整数到负1,而1Llong整数到正1。

至于为什么ftell不只是返回NULL ,这是因为NULL用于指针,这里返回long 。 请注意,不使用0因为0是要返回的ftell的有效值。

捕获这种情况涉及检查非负值:

 long size; FILE *pFile; ... size = ftell(pFile); if(size > -1L){ // size is a valid value }else{ // error occurred } 

ftell()返回类型long int ,应用于文字的L后缀强制其类型为long而不是plain int

NULL将完全不正确,因为它是一个表示指针而不是整数的宏。 它的值,当被解释时,整数可以表示有效的文件位置,而-1(或任何负值)则不能。

对于所有意图和目的,您通常可以简单地将错误返回视为-1,由于隐式转换规则,L后缀在大多数情况下对于正确操作并不重要

它意味着将值返回为long,而不是int。

这意味着-1为长(而不是数字的默认类型,这是一个整数)

long int中形成的-1-1L 。 为什么不简单的NULL ? 因为此函数中的NULL是正常结果,也无法识别错误。 为什么这个函数中的NULL是正常结果? 因为NULL == 0并且ftell返回流中的位置,当你在启动流函数时返回0并且这是正常结果而不是错误,那么如果你将这个函数比较为NULL来检查错误,那么你将会得到错误你将在流中的起始位置。

今天的编辑意味着仍然需要更多细节。

马克是对的。 “L”后缀很长。 因此-1L是长-1。

我最喜欢的测试方式与Marks不同,是一个偏好而不是善良的问题。

  if(err> = 0L)
    成功
其他
    错误 

根据一般习惯,我不喜欢寻找显式-1。 如果将来弹出-2,我的代码可能不会破坏。

自从我开始使用C之后,回到C的开头,我注意到大多数返回int值的库例程返回0表示成功,返回-1表示错误。 最。

整数函数通常不返回NULL,因为NULL是指针值。 除了类型的冲突之外,不返回NULL的一个重要原因取决于一些历史。

当C被发明时,事情并不干净,甚至可能在今天的小型系统上都没有。 原始的K&R C不保证NULL将为零,因为具有虚拟内存的CPU通常就是这种情况。 在小“实际存储器”系统上,零可以是有效地址,使得“无效”地址必须移动到某个其他OS相关位置。 这样的确会被CPU接受,而不是在正常的方案中生成。 也许是一个非常高的内存地址。 我甚至可以看到一个名为extern const long NULL[1];的隐藏数组extern const long NULL[1]; 允许NULL成为此未使用的数组的地址。

那时你看到很多if ( ptr != NULL )语句,而不是if ( ptr )对于那些认真编写可移植代码的人。