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

时间:2010-11-06 22:44:37

标签: c

“-1L”,“1L”等在C中意味着什么?

例如,在ftell引用中,它表示

  

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

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

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

6 个答案:

答案 0 :(得分:38)

L指定该数字为long类型,因此-1Llong设置为负数,1Llong 1}}设置为正数。

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

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

long size;
FILE *pFile;

...

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

答案 1 :(得分:6)

ftell()返回类型 long int ,应用于文字的L后缀强制其类型为 long 而不是普通 int 。< / p>

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

-1中格式化的{p> long int-1L。为什么不简单NULL?因为此函数中的NULL是正常结果,也无法识别错误。为什么此函数中的NULL是正常结果?因为NULL == 0ftell返回流中的位置,所以当你在流函数的开始时返回0并且这是正常结果而不是错误,那么如果你将这个函数与{{ 1}}检查错误,当你在流中的起始位置时,你会收到错误。

答案 5 :(得分:1)

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

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

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

if ( err >= 0L )
    success
else
    error

按照一般习惯,我不喜欢寻找显式-1。如果将来弹出-2,我的代码可能不会中断。

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

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

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

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