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

hxzsmxv2  于 2022-12-03  发布在  其他
关注(0)|答案(6)|浏览(2924)

C语言中的“-1L”、“1 L”等是什么意思?
例如,在ftell引用中,它表示
...如果发生错误,则返回-1L...
这是什么意思?“1 L”是什么类型?
如果发生错误,为什么不返回NULL?

iovurdzv

iovurdzv1#

L指定数字是long类型,因此-1L是设置为负1的long,而1L是设置为正1的long
至于为什么ftell不只是返回NULL,这是因为NULL用于指针,这里返回的是long。注意,没有使用0,因为0ftell返回的有效值。
捕捉这种情况需要检查非负值:

long size;
FILE *pFile;

...

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

abithluo2#

ftell()返回类型 long int,应用于文本的L后缀强制其类型为 long 而不是plain int
NULL将完全不正确,因为它是表示 * 指针 * 而不是 * 整数 * 的宏。它的值在解释为整数时可以表示有效的文件位置,而-1(或任何负值)则不能。
对于所有意图和目的,您通常可以简单地将错误返回视为-1,由于隐式转换规则,在大多数情况下,L后缀对于正确操作并不重要

w46czmvw

w46czmvw3#

它表示以long而不是int的形式返回值。

kknvjkwl

kknvjkwl4#

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

eh57zj3b

eh57zj3b5#

long int-1-1L。为什么不是简单的NULL?因为这个函数中的NULL是一个正常的结果,也不能同步错误。为什么这个函数中的NULL是一个正常的结果?因为NULL == 0ftell返回流中的位置。当你在流函数的开始返回0,这是一个正常的结果,而不是错误,那么如果你比较这个函数与NULL检查错误,你会得到错误时,你将在流的开始位置。

u4vypkhs

u4vypkhs6#

今天的编辑意味着还需要更多的细节。
马克说得对,后缀“L”很长,所以-1L就是长-1。
我喜欢的测试方法与马克斯不同,是一个偏好而不是善良的问题。

if ( err >= 0L )
    success
else
    error

一般来说,我不喜欢寻找显式的-1。如果将来出现-2,我的代码将likely不会中断。
自从我开始使用C语言以来,我注意到大多数返回int值的库例程在成功时返回0,在错误时返回-1。
整数函数通常不返回NULL,因为NULL是一个指针值。除了类型冲突之外,不返回NULL的一个重要原因取决于一点历史。
当C语言被发明出来的时候,情况并不干净,甚至在今天的小系统上也可能不干净。最初的K&R C并不保证NULL会是零,就像通常在具有虚拟内存的CPU上的情况一样。在小的“真实的内存”系统上,零可能是一个有效的地址,这使得“无效”地址必须被移动到其他一些依赖于操作系统的位置。这样的地址确实会被CPU接受。我甚至可以看到一个名为extern const long NULL[1];的隐藏数组,它允许NULL成为这个未使用数组的地址。
那时,对于那些认真编写可移植代码的人来说,你会看到很多if ( ptr != NULL )语句,而不是if ( ptr )

相关问题