2010-11-06 154 views
18

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

例如,在ftell参考,它说

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

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

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

回答

39

L指定该号码是一个long类型,所以-1Llong设置为负一,和1Llong设定为正的。

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

捕捉这种情况涉及到检查一个非负值:

long size; 
FILE *pFile; 

... 

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

好吧,我明白了。那么我怎样才能捕捉到返回-1L的情况呢? --- if(ftell(fp)== -1L){}?或者if(ftell(fp)== -1){}? – bogatyrjov 2010-11-06 23:00:15

+0

@Jevgeni,编辑给你一个例子 – 2010-11-06 23:03:03

+0

所以,如果L表示长,哪些字符代表其他类型?网上有相关的参考资料吗? – bogatyrjov 2010-11-06 23:09:38

4

这意味着返回值作为一个长,而不是一个int。

2

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

+3

'long' *是一个整数类型。我认为你的意思是整数*常数*的默认类型是'int' - 但即使这样做过于简单化了。 – 2013-07-21 00:20:01

2

-1格式化在long int-1L。为什么不简单NULL?因为这个函数中的NULL是一个正常的结果,也不能同时发生错误。为什么NULL在这个函数中是正常的结果?由于流NULL == 0ftell回报的位置,当你在流函数的开头,则返回0这是一个正常的结果没有错误,那么如果你比较这功能NULL检查错误,你会得到错误的时候,你会在流中的开始位置。

+1

不,'NULL'不是'ftell'的正常结果。 'ftell'函数返回一个'long',而不是一个指针。 – 2013-07-21 00:19:30

6

FTELL()返回一个类型长整型中,L施加于字面的力其类型而不是纯INT后缀。

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

对于所有意图和目的,你可以简单地一般都把错误返回为-1,将L后缀不是纠正在大多数情况下,操作的关键,由于隐式转换规则

+0

+1是唯一一个似乎知道指针和整数之间区别的人。 – 2010-11-07 00:41:33

+1

将空指针转换为整数不一定*会产生0。 – 2013-07-21 01:07:41

+0

NULL不代表指针,它被定义为0,0L或0ULL等。这就是C++ 11引入nullptr的原因。考虑:int foo(const char *); int foo(unsigned long f); ... foo(NULL);'。如果你认为“NULL”是一个指针类型,那么你不会去调用你期望的那个。 – kfsone 2013-07-21 01:08:46

1

编辑今天意味着更多的细节仍在通缉。

马克有它的权利。 “L”后缀很长。 -1L因此是长-1。

我的测试常用的手段是不同的标记,是偏好的问题不善良。

if (err >= 0L) 
    success 
else 
    error

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

从我开始使用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)人认真编写可移植的代码。

+0

C * still *不能保证空指针具有与零相同的表示形式,它保证了一个整型常量表达式的值为零,或者这样一个表达式转换为void *类型,它是一个空指针常量。时间,这样一个常量将被转换为空指针 - 无论表示如何。推荐阅读:[comp.lang.c FAQ](http://www.c-faq.com/)的第5部分。个人而言,我仍然写'if(ptr!= NULL)'ra而不是'if(ptr)' - 不是为了便于携带,而是为了清晰。 – 2013-07-21 01:06:59

+0

同意。我也这么做,除非,也许我正在写一个POSIX环境,其中所有现有的代码都没有。然后我会遵循既定的惯例。 – Gilbert 2013-07-21 01:17:27