该C99
标准要求“null character
在基本执行字符集中应存在一个所有位都设置为 0 的字节,称为 ,它用于终止字符串。” (5.2.1.2) 然后继续列出必须在执行集中的其他 99 个字符。可以使用空字符是这 99 个字符之一的字符集吗?特别是,是否允许这样做'0' == '\0'
?
编辑:每个人都指出,在 ASCII 中,'0'
是0x30
. 确实如此,但该标准并未强制要求使用 ASCII。
该C99
标准要求“null character
在基本执行字符集中应存在一个所有位都设置为 0 的字节,称为 ,它用于终止字符串。” (5.2.1.2) 然后继续列出必须在执行集中的其他 99 个字符。可以使用空字符是这 99 个字符之一的字符集吗?特别是,是否允许这样做'0' == '\0'
?
编辑:每个人都指出,在 ASCII 中,'0'
是0x30
. 确实如此,但该标准并未强制要求使用 ASCII。
无论您使用 ASCII、EBCDIC 还是“自制”的东西,'0'
都必须区别于'\0'
,因为您提到自己的原因:
一个所有位都设置为 0 的字节,称为
null character
,应存在于基本执行字符集中;它用于终止一个字符串。(5.2.1.2)
如果空字符终止一个字符串,则它不能包含在该字符串中。它是唯一不能包含在字符串中的字符;所有其他字符都可以使用,因此必须不同于 0。
我不认为标准规定它列出的每个字符(包括空字符)都有不同的值,除了数字。但是,包含一个0
据称代表 100 个必需字符中的 91 个值的“字符集”显然不是真正包含必需 100 个字符的字符集。所以这是:
任你选。
在这种情况下,'0'='\0'
您将无法区分字符串和'0'
值的结尾。
因此使用“0_any_string”之类的东西会有点困难,因为它已经从'0'
.
不,它不能。字符集必须用单射函数来描述,即将每个字符映射到一个完全不同的二进制值的函数。将 2 个字符映射到相同的值将使字符集不确定,即计算机将无法将数据解释为匹配的字符,因为有多个匹配。
C99 标准通过强制将null
字符映射到特定的二进制值来提出另一个限制。鉴于上述段落,这意味着没有其他字符可以具有与 相同的值null
。
整数常量文字 0 具有不同的含义,具体取决于使用它的上下文。在所有情况下,它仍然是一个值为 0 的整数常量,只是以不同的方式描述。
如果将指针与常量文字 0 进行比较,则检查该指针是否为空指针。然后这个 0 被称为空指针常量。C 标准定义 0 类型转换为 void * 既是空指针又是空指针常量。