做什么 “-1L”, “1L” 等用C是什么意思?什么是C中的“-1L”?
例如,在ftell参考,它说
...如果发生错误,-1L返回...
这是什么意思?什么是“1L”?
为什么不返回NULL,如果发生错误?
做什么 “-1L”, “1L” 等用C是什么意思?什么是C中的“-1L”?
例如,在ftell参考,它说
...如果发生错误,-1L返回...
这是什么意思?什么是“1L”?
为什么不返回NULL,如果发生错误?
的L
指定该号码是一个long
类型,所以-1L
是long
设置为负一,和1L
是long
设定为正的。
至于为什么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
}
这意味着返回值作为一个长,而不是一个int。
这意味着-1作为一个长(而不是数字的默认类型,它是一个整数)
'long' *是一个整数类型。我认为你的意思是整数*常数*的默认类型是'int' - 但即使这样做过于简单化了。 – 2013-07-21 00:20:01
-1
格式化在long int
是-1L
。为什么不简单NULL
?因为这个函数中的NULL
是一个正常的结果,也不能同时发生错误。为什么NULL
在这个函数中是正常的结果?由于流NULL == 0
和ftell
回报的位置,当你在流函数的开头,则返回0
这是一个正常的结果没有错误,那么如果你比较这功能NULL
检查错误,你会得到错误的时候,你会在流中的开始位置。
不,'NULL'不是'ftell'的正常结果。 'ftell'函数返回一个'long',而不是一个指针。 – 2013-07-21 00:19:30
FTELL()返回一个类型长整型中,L施加于字面的力其类型长而不是纯INT后缀。
NULL将是完全不正确的,因为它是代表指针的宏指令而不是整数。它的值在解释时是一个整数可以表示有效的文件位置,而-1(或任何负值)不能。
对于所有意图和目的,你可以简单地一般都把错误返回为-1,将L后缀不是纠正在大多数情况下,操作的关键,由于隐式转换规则
+1是唯一一个似乎知道指针和整数之间区别的人。 – 2010-11-07 00:41:33
将空指针转换为整数不一定*会产生0。 – 2013-07-21 01:07:41
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
编辑今天意味着更多的细节仍在通缉。
马克有它的权利。 “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)
人认真编写可移植的代码。
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
同意。我也这么做,除非,也许我正在写一个POSIX环境,其中所有现有的代码都没有。然后我会遵循既定的惯例。 – Gilbert 2013-07-21 01:17:27
好吧,我明白了。那么我怎样才能捕捉到返回-1L的情况呢? --- if(ftell(fp)== -1L){}?或者if(ftell(fp)== -1){}? – bogatyrjov 2010-11-06 23:00:15
@Jevgeni,编辑给你一个例子 – 2010-11-06 23:03:03
所以,如果L表示长,哪些字符代表其他类型?网上有相关的参考资料吗? – bogatyrjov 2010-11-06 23:09:38