1

C99标准要求“null character在基本执行字符集中应存在一个所有位都设置为 0 的字节,称为 ,它用于终止字符串。” (5.2.1.2) 然后继续列出必须在执行集中的其他 99 个字符。可以使用空字符是这 99 个字符之一的字符集吗?特别是,是否允许这样做'0' == '\0'

编辑:每个人都指出,在 ASCII 中,'0'0x30. 确实如此,但该标准并未强制要求使用 ASCII。

4

5 回答 5

3

无论您使用 ASCII、EBCDIC 还是“自制”的东西,'0'都必须区别于'\0',因为您提到自己的原因:

一个所有位都设置为 0 的字节,称为null character,应存在于基本执行字符集中;它用于终止一个字符串。(5.2.1.2)

如果空字符终止一个字符串,则它不能包含在该字符串中。它是唯一不能包含在字符串中的字符;所有其他字符都可以使用,因此必须不同于 0。

于 2013-03-25T08:48:42.810 回答
3

我不认为标准规定它列出的每个字符(包括空字符)都有不同的值,除了数字。但是,包含一个0据称代表 100 个必需字符中的 91 个值的“字符集”显然不是真正包含必需 100 个字符的字符集。所以这是:

  • “字符集”的英文定义的一部分,
  • 从上下文中显而易见,
  • 标准文本中的一个非常小的缺陷,应将其拼写出来以防止不忠实的实施者故意误解。

任你选。

于 2013-03-25T09:26:06.053 回答
2

在这种情况下,'0'='\0'您将无法区分字符串和'0'值的结尾。

因此使用“0_any_string”之类的东西会有点困难,因为它已经从'0'.

于 2013-03-25T08:32:02.013 回答
1

不,它不能。字符集必须用单射函数来描述,即将每个字符映射到一个完全不同的二进制值的函数。将 2 个字符映射到相同的值将使字符集不确定,即计算机将无法将数据解释为匹配的字符,因为有多个匹配。

C99 标准通过强制将null字符映射到特定的二进制值来提出另一个限制。鉴于上述段落,这意味着没有其他字符可以具有与 相同的值null

于 2013-03-25T08:50:54.410 回答
-1

整数常量文字 0 具有不同的含义,具体取决于使用它的上下文。在所有情况下,它仍然是一个值为 0 的整数常量,只是以不同的方式描述。

如果将指针与常量文字 0 进行比较,则检查该指针是否为空指针。然后这个 0 被称为空指针常量。C 标准定义 0 类型转换为 void * 既是空指针又是空指针常量。

NULL, '\0' 和 0 有什么区别

于 2013-03-25T08:34:01.430 回答