40

我知道EOF并且'\0'是整数类型,但如果是这样,它们不应该有一个固定值吗?

我打印了两者并得到 -1EOF和 0 '\0'。但是这些值是固定的吗?

我也有这个

int a=-1;

printf("%d",a==EOF); //printed 1

是固定整数EOF的值吗?'\0'

4

5 回答 5

66

EOF是一个宏,它扩展为具有类型int和实现相关负值的整数常量表达式,但通常为 -1。

'\0'char在 C++ 中是值为 0 的 a,在 C 中是值为 0 的 a int

printf("%d",a==EOF);导致的原因1是因为您没有将值分配EOFa. 相反,您检查了是否a等于,EOF并且因为它是 true ( a == -1 == EOF),所以它打印出来1

于 2011-01-16T14:49:13.707 回答
28

NULL并且'\0'保证评估为 0,因此(通过适当的强制转换)可以认为它们的值相同;但是请注意,它们代表两个非常不同的东西:NULL是一个空(总是无效)指针'\0'而是字符串终止符。EOF而是一个负整数常量,指示流的结束;通常它是-1,但标准并没有说明它的实际值。

C & C++ 在NULLand的类型上有所不同'\0'

  • 在 C++'\0'中是 a char,而在 C 中是int; 这是因为在 C 中所有字符文字都被视为ints。
  • 在 C++NULL中“只是”一个整数 0,而在 C 中它可以定义为一个 0 强制转换为void *; 这不能在 C++ 中完成(并且在注释中明确禁止),因为 C++ 在指针转换方面更加严格, avoid *不能隐式转换为任何其他指针类型,因此,如果NULL是 a void *,则有必要将其转换为赋值时的目标指针类型:

    int * ptr = (void *) 0; /* valid C, invalid C++ */
    

相关标准报价:

C++98/03

NULL

NULL是保证评估为 0 的整数类型:

4.10 指针转换

空指针常量是整数类型的整数常量表达式 (5.19) 右值,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的所有其他值区分开来。相同类型的两个空指针值应比较相等。将空指针常量转换为指向 cv 限定类型的指针是一次转换,而不是指针转换后跟限定转换 (4.4) 的顺序。

18.1 类型

[...] 宏 NULL 是本国际标准 (4.10) 中实现定义的 C++ 空指针常量。(可能的定义包括0and 0L,但不是(void*)0)。

'\0'

必须存在 0 值字符:

2.2 字符集

基本执行字符集和基本执行宽字符集应各自包含 [...] 一个空字符(分别为空宽字符),其表示全为零。

'\0'char文字:

2.13.2 字符文字

字符文字是用单引号括起来的一个或多个字符,如 中'x',前面可选字母 L,如 L'x'。不以 L 开头的字符文字是普通字符文字,也称为窄字符文字。包含单个c-char的普通字符文字具有 type ,其值等于执行字符集中c-charchar编码的数值。

它的值为 0,因为转义序列指定了它的值:

转义\ooo由反斜杠组成,后跟一个、两个或三个八进制数字,用于指定所需字符的值。

'\0'用于终止字符串文字:

2.13.4 字符串文字

在任何必要的连接之后,在翻译阶段 7 (2.1) 中,'\0'将附加到每个字符串文字,以便扫描字符串的程序可以找到它的结尾。

EOF

的定义EOF委托给 C89 标准(如第 27.8.2 节“C 库文件”中所述),其中定义为特定于实现的负整数。

C99

NULL

空指针是一个 0 整数,可以选择强制转换为void *; NULL是一个空指针。

6.3.2.3 指针

[...] 值为 0 的整数常量表达式,或转换为 type 的此类表达式 void *,称为空指针常量。(宏NULL<stddef.h>(和其他头文件)中定义为空指针常量;参见 7.17。)如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指针不相等任何对象或功能。

7.17 常用定义<stddef.h>

[...]宏是

NULL

它扩展为实现定义的空指针常量;[...]

'\0'

'\0'是一个值为 0 的整数,用于终止字符串:

5.2.1 字符集

[...] 一个所有位都设置为 0 的字节,称为空字符,应存在于基本执行字符集中;它用于终止一个字符串。

6.4.4.4 字符常量

整数字符常量是包含在单引号中的一个或多个多字节字符的序列,如'x'. [...]

八进制转义序列中反斜杠后面的八进制数字被视为整数字符常量的单个字符或宽字符常量的单个宽字符构造的一部分。如此形成的八进制整数的数值指定所需字符或宽字符的值。[...]

整数字符常量的类型为int

EOF

EOF是实现定义的负整数

7.19 输入/输出<stdio.h>

7.19.1 简介

EOF

它扩展为一个整数常量表达式,具有类型int和负值,由几个函数返回以指示文件结束,即不再有来自流的输入

于 2011-01-16T15:36:13.410 回答
6

'\0' 始终是空字符或 0。EOF 取决于编译器,但通常为 -1,并且始终是 anunsigned char无法保存的值。不要依赖 EOF 的价值,因为它可以改变。总是做 x == EOF 而不是 x == -1。'\0' 的值总是 0。你可以指望它。

于 2011-01-16T14:49:03.470 回答
0

是的,他们是。'\0'具有相同的值,NULL其值为 0(但它们的含义不同),而 EOF 通常为 -1。

printf("%d",a==EOF); //printed 1

在这种情况下,您要问:是 == EOF 吗?如果它是 print 1(这是真的),它不是 print 0(这是错误的)。

于 2011-01-16T14:50:21.737 回答
-1

'\0' 始终为 0

EOF 依赖于编译器

最常见的是它的 -1(在 gcc 和 g++ 中它是 -1)。

于 2011-01-16T14:54:06.760 回答