为什么在Delphi中可以使用抑扬符号来控制字符,并且这样做是否明智?

7
我刚在SO上看到一个有趣语法的答案: 如何在Delphi字符串中包含换行符? 我的代码是这样的:MyString := 'Hello,' + ^M + ^J + 'world!';
我使用Delphi已经好几年了,但我不知道你可以用插入符号来表示控制字符。
这只是早期Delphi或Turbo Pascal遗留下来的吗?
现在还应该使用它吗?
PS:我不是在询问关于换行字符的建议,原问题中已经讨论了sLineBreak和其他方法。

1
我刚刚注意到这是一个重复的问题:https://dev59.com/3G445IYBdhLWcg3wUoxe - Jens Mühlenhoff
2
@PieterB 这就是为什么使用单个字符变量名不是一个好主意的原因。;-) - GolezTrol
获取变量的地址也使用@语法。 - Jens Mühlenhoff
当然可以在常量部分使用类型,只要使用Constant: TSomeType = 语法 :)。 - Jens Mühlenhoff
1
@golez 对于本地循环变量使用单个字符名称是完全可以的。对于矩阵乘法,我总是使用i、j和k作为我的循环变量名称。 - David Heffernan
显示剩余5条评论
3个回答

9
不,它不是来自Turbo Pascal时代。它比TP早数十年,早于MS-DOS,甚至可能早于UNIX。像第一个300比特每秒的拨号调制解调器和DEC VT-52终端,PDP-8机器上的RT-8操作系统和早期版本的C语言一样古老。或者甚至更古老-尽管对我来说,所有更古老的都只是传说 :-)
“^”符号是“Ctrl”键的快捷方式。因此,在传统表示法中,“^C”代表Microsoft表示法中的“Ctrl+C”。这种表示法在MS-DOS时代被广泛用于文本模式菜单,例如前面提到的Turbo Pascal、Norton Utilities、DOS Navigator等。
根据我的记忆,您可以将“^”视为“减去64”。因此,如果Chr(65)'A',那么Chr(1)就是^A
^@将是#0 :-) 在MS-DOS时代,按下Ctrl+Shift+"2/@"实际上会将#0输入BIOS键盘缓冲区 :-)
^[ AFAIR将是#27,也就是Esc(ape)字符——如果您运行telnet.exe,您将看到它作为转义字符提示。
因此,Turbo Pascal早就选择遵循历史悠久的惯例,然后自那时起,向后兼容的规则一直在发挥作用。个人而言,当您希望将其放在一行上时,“'bla-bla'^M^J'foo-baz'”比“'bla-bla'#13#10'foo-baz'”更像字符串。如果您的字面量占用了几行源代码,则使用加号构造该值更合适。
可惜的是,在Delphi IDE中对这种常量的语法高亮显示已经彻底破损了。

4

是的,这是早期遗留下来的东西。

但是,您不应该养成使用此功能的习惯。请记住,代码更多地被阅读而不是被编写。始终考虑您的读者,他们很可能不知道那个语法意味着什么。


过去的好时光,我想是吧?(当时我还不够年轻来编码,但据说 Delphi 开发的过去比现在更棒) - Jeff
2
@Jeff,你说得对,但这个结构是在 Delphi 成为 Delphi 之前的时代设计的。 :) - GolezTrol
3
在 Turbo Pascal 诞生之前! - Gerry Coll

0

是的,这是TP时代留下的。你也可以像这样编写语句

mystring:= 'Hello'#13#10'world!';

这种方法可能比使用^M和^J更易于理解。当然,你应该定义常量。

const
 crlf = #13#10

begin
 mystring:= 'Hello' + crlf + 'world!';
end;

1
如果我们在谈论定义常量,那么你需要使用sLineBreak。;-) - TLama
同时使用"sLineBreak"将使代码具有"跨平台意识",因为它在Windows和Mac上有不同的含义 :) - iPath ツ

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