C中的“-1L”是什么?
C中的“-1L”,“1L”等是什么意思?
例如,在ftell参考中,它说
…如果发生错误,则返回-1L …
这是什么意思 ? 什么是“1L”?
如果发生错误,为什么不返回NULL?
L
指定数字是long
类型,因此-1L
是long
整数到负1,而1L
是long
整数到正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 )
对于那些认真编写可移植代码的人。