什么是EOF的值和'\ 0'在C中

the*_*ick 35 c c++ null eof

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

我打印了两个并获得-1 EOF和0 '\0'.但这些价值是固定的吗?

我也有这个

int a=-1;

printf("%d",a==EOF); //printed 1
Run Code Online (Sandbox Code Playgroud)

EOF'\0'整数的值?

CB *_*ley 51

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

'\0'charC++中int的值为0,C中的值为0

为什么原因printf("%d",a==EOF);导致了1是因为你没有指定值EOFa.相反,你检查是否a等于EOF,因为那是真的(a == -1 == EOF)它打印1.

  • @Shyam - 为什么有这样的需要?如果你正在谈论指针,请使用`NULL`,如果你正在谈论字符,则使用'\ 0'`,并在检查文件结尾时使用`EOF`.这样做可以减少您的代码混乱. (5认同)
  • @ShyamLovesToCode:如果每个整数可以在其范围内取任何值,那么根据定义,没有有效的整数可以是sentinel值.如果要存储"非值"标志,则必须使用其他数据项执行此操作. (4认同)
  • @ShyamLovesToCode:你不一定能区分0和NULL,因为NULL可能会扩展为0.我看不出你需要怎样或为什么,你能澄清一下吗? (2认同)
  • 如果能够存储任何整数值,则需要额外的数据结构.如果能够存储几乎任何整数值都可以,那么您可以使用INT_MAX来表示无效数据. (2认同)

Mat*_*lia 27

NULL并且'\0'保证评估为0,所以(使用适当的演员表)他们可以被认为是相同的价值; 但请注意,它们代表两种截然不同的东西:NULL是一个null(总是无效的)指针,'\0'而是字符串终止符.EOF而是一个负整数常量,表示流的结束; 通常它是-1,但标准没有说明它的实际价值.

C&C++的类型NULL'\0':

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

    int * ptr = (void *) 0; /* valid C, invalid C++ */
    
    Run Code Online (Sandbox Code Playgroud)

相关标准报价:

C++ 98/03

NULL

NULL 是一个保证计算为0的整数类型:

4.10指针转换

空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的每个其他值区分开来.相同类型的两个空指针值应相等.将空指针常量转换为指向cv限定类型的指针是单个转换,而不是指针转换的序列,后跟限定转换(4.4).

18.1类型

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

'\0'

必须存在0值char:

2.2字符集

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

'\0'char文字:

2.13.2字符文字

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

它的值为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的整型常量表达式,或者这种表达式转换为类型 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和负值,由几个函数返回以指示文件结束,即不再有来自流的输入


Leo*_*zen 5

'\ 0'始终是空字符,或0. EOF取决于编译器,但通常为-1,并且始终是一个unsigned char无法容纳的值.不要依赖EOF的价值,因为它可以改变.总是做x == EOF而不是x == -1.'\ 0'的值始终为0.您可以依赖它.

  • `EOF` 是 `int` 类型。由于它是负数,因此根据定义,它是一个 `unsigned char` 不能容纳的值。但是由于 `unsigned char` 和 `int` 可能具有相同的大小(如果 `CHAR_BIT &gt;= 16`),可能无法区分 `EOF` 和来自 `getchar()` 的有效结果。这是带内信令的一个缺点。但是忽略这一点是 99.99+% 的安全,因为具有 `CHAR_BIT &gt;= 16` 的唯一现实世界系统是 DSP,并且无论如何您都不会期望可移植 I/O 代码在这样的系统上运行。 (2认同)