如何在Delphi中定义空字符

15

只是出于好奇,

为什么在Delphi中,如果我们定义一个空字符:

a:Char;
a:='';

我们遇到了一个错误:不兼容的类型:'Char'和'string'

然而,如果我们将

a:='a';

这样定义空字符是否必要:a:=#0


2
在.NET世界中,您可以拥有一个“空”的Char,因为它们有可为空的类型(通过它们的泛型系统)。而在数据库世界中,数据库字段可以是可为空的,但所有的Delphi Ordinal类型,包括Integer、Char、Byte等,虽然它们可能有一些哨兵(标志)或零值(#0)用于Char,但不能是“空”或“null”。由于字符串和数组不是Ordinal类型,规则是不同的。字符串就像“字符的动态数组”。 - Warren P
2
你对 '' 常量表达式感到困惑。它的类型是 string,而不是与 char 兼容的类型。相反,'a' 是兼容的。因此,你必须定义“空字符”约定。 - OnTheFly
2个回答

29

Char指单个字符,即只有一个字符。因此,'a'、'∫'和'⌬'都可以,但不包括'ab'(一个由两个字符组成的字符串)、'Hello World!'(一个由十二个字符组成的字符串)或''(一个零长度的字符串)。

然而,NULL字符(#0)像其他字符一样是一个字符。

此外,字符数据类型在现代版本的Delphi中被实现为一个字,即两个字节。如果所有这些值0、1、...、2^16 - 1都用于真实字符,那么你如何表示你的“空字符”呢?


1
@Zeina:当然,Delphi编译器可以将''视为#0的同义词,但我会觉得这很令人困惑。此外,写#0比写''需要更长的时间吗? - Andreas Rejbrand
1
@Marco:“传统的C系统”?Windows API? - Andreas Rejbrand
4
我一直不喜欢 Delphi 在字符常量和字符串常量中都使用单引号。这可能会使编码更加容易,但也会导致混淆,就像这个例子一样。我主要使用 C++,它使用单引号表示字符,双引号表示字符串。对我来说更加明确和直观。 - Remy Lebeau
关于 a:='' 的问题,我认为是因为Delphi使用两个连续的单引号来转义单引号字面量。例如a:=''''会将a设置为一个单引号。因此a:=''就相当于说a:=',这不是合法的语法。 - Jonathan Elkins
1
@JonathanElkins:不,情况并非如此。 '' 只是空字符串,可以完全合法地使用该组合,例如在 ShowMessage('') 中。但是空字符串由零个字符组成,因此它不是一个字符。 - Andreas Rejbrand
显示剩余10条评论

20

一个空的 char 并不存在。一个 char 必须要有一个值。它是一种序数类型,也是一种简单值类型。就像整数一样,总是有一个值,char 也是如此。

值为 #0 的并不是一个空的 char,而是一个具有值为0的字符,通常称为 NUL


3
在Pascal中,ordinal类型表示为“序数类型”。 - OnTheFly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接