将 char 变量与空 char 进行比较不起作用

Comparing a char variable to empty char does not work

x是一个字符。 每当我做 if(x <> '') 来知道变量是否为空时,它就不起作用。 但是,当我尝试这样做时 if(x <> chr(0)),它确实有效。 我在两个版本的编译器上尝试了同样的事情:Free Pascal 和 Charm Pascal,但我仍然面临同样的问题。

没有“空字符”这样的东西。 Char 类型始终是单个字符。

该字符可能是 1 个字节 AnsiChar,表示来自 0..255 的值。 (在 Delphi 和 fpc 中,它也可以是一个 2 字节的 WideChar,表示来自 0..65535 的值。)无论哪种方式,它总是表示为 '<something>'。那个“东西”必须是一个字符值。

当您比较 x <> Chr(0) 时,您正在获取 0 字节值 并将其转换为 Char,因此有效的比较可以被执行。


旁注

对于Char可靠有“无价值”的概念需要存储额外的信息。例如。数据库可能有一个 隐藏的内部 位字段,指示值为 NULL。请务必注意,如果它不是 NULL,它与它可能具有的任何有效值根本不同。与数据库交互的库需要提供一种方法来确定值是否为 NULL.

您没有提供任何关于您试图解决的实际问题的信息,但这里有一些可能会产生进展的想法:

  • 如果您正在处理用户输入,与 space 字符进行比较可能更合适 ' '
  • 如果您正在处理从文件中读取的字符,您可能应该检查 bytes/characters 实际读取的字符数。
  • 如果您要确定字符串的结尾,使用字符串的 Length() 更为可靠。
    • (尽管有些环境使用将 Char(0) 视为特殊字符的约定,意思是“字符串结尾”。)但约定需要分配 一个额外的字符 使字符串在内部比其文本长度长。所以如果环境不支持,技术不可用
  • 最重要的是,从评论来看,您可能正在努力区分 空字符串 Char 的表示方式。关键是它不是。您需要检查字符串的长度。

例如您可以执行以下操作:

if (s <> '') then
begin
  { You now know there is at least 1 character in the string so
    you can safely read it and not worry about "if it has a value".}
  x := s[1];
  ...
end;