C语言中的“-1L”、“1 L”等是什么意思?例如,在ftell引用中,它表示...如果发生错误,则返回-1L...这是什么意思?“1 L”是什么类型?如果发生错误,为什么不返回NULL?
iovurdzv1#
L指定数字是long类型,因此-1L是设置为负1的long,而1L是设置为正1的long。至于为什么ftell不只是返回NULL,这是因为NULL用于指针,这里返回的是long。注意,没有使用0,因为0是ftell返回的有效值。捕捉这种情况需要检查非负值:
L
long
-1L
1L
ftell
NULL
0
long size; FILE *pFile; ... size = ftell(pFile); if(size > -1L){ // size is a valid value }else{ // error occurred }
abithluo2#
ftell()返回类型 long int,应用于文本的L后缀强制其类型为 long 而不是plain int。NULL将完全不正确,因为它是表示 * 指针 * 而不是 * 整数 * 的宏。它的值在解释为整数时可以表示有效的文件位置,而-1(或任何负值)则不能。对于所有意图和目的,您通常可以简单地将错误返回视为-1,由于隐式转换规则,在大多数情况下,L后缀对于正确操作并不重要
w46czmvw3#
它表示以long而不是int的形式返回值。
kknvjkwl4#
这意味着-1是一个长整型(而不是数字的默认类型,即整数)
eh57zj3b5#
long int的-1是-1L。为什么不是简单的NULL?因为这个函数中的NULL是一个正常的结果,也不能同步错误。为什么这个函数中的NULL是一个正常的结果?因为NULL == 0和ftell返回流中的位置。当你在流函数的开始返回0,这是一个正常的结果,而不是错误,那么如果你比较这个函数与NULL检查错误,你会得到错误时,你将在流的开始位置。
long int
-1
NULL == 0
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 )。
likely
extern const long NULL[1];
if ( ptr != NULL )
if ( ptr )
6条答案
按热度按时间iovurdzv1#
L
指定数字是long
类型,因此-1L
是设置为负1的long
,而1L
是设置为正1的long
。至于为什么
ftell
不只是返回NULL
,这是因为NULL
用于指针,这里返回的是long
。注意,没有使用0
,因为0
是ftell
返回的有效值。捕捉这种情况需要检查非负值:
abithluo2#
ftell()返回类型 long int,应用于文本的L后缀强制其类型为 long 而不是plain int。
NULL将完全不正确,因为它是表示 * 指针 * 而不是 * 整数 * 的宏。它的值在解释为整数时可以表示有效的文件位置,而-1(或任何负值)则不能。
对于所有意图和目的,您通常可以简单地将错误返回视为-1,由于隐式转换规则,在大多数情况下,L后缀对于正确操作并不重要
w46czmvw3#
它表示以long而不是int的形式返回值。
kknvjkwl4#
这意味着-1是一个长整型(而不是数字的默认类型,即整数)
eh57zj3b5#
long int
的-1
是-1L
。为什么不是简单的NULL
?因为这个函数中的NULL
是一个正常的结果,也不能同步错误。为什么这个函数中的NULL
是一个正常的结果?因为NULL == 0
和ftell
返回流中的位置。当你在流函数的开始返回0
,这是一个正常的结果,而不是错误,那么如果你比较这个函数与NULL
检查错误,你会得到错误时,你将在流的开始位置。u4vypkhs6#
今天的编辑意味着还需要更多的细节。
马克说得对,后缀“L”很长,所以-1L就是长-1。
我喜欢的测试方法与马克斯不同,是一个偏好而不是善良的问题。
一般来说,我不喜欢寻找显式的-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 )
。