我在Delphi语言中遇到过一些我之前没有注意到的东西。考虑一个简单的记录和指向该记录的指针:
TRecord = record
value : double;
end;
PTRecord = ^TRecord;
现在声明一个PTRecord类型的变量:
var x : PTRecord;
并创建一些空间:
x := new (PTRecord);
我注意到我可以使用'。'访问值字段。符号和'^。'符号。因此,以下两行似乎在操作上是等效的,编译器不会抱怨并且运行时工作正常:
x.value := 4.5;
x^.value := 2.3;
我原以为'^。'是正确的,唯一的方式来获取价值?我的问题是,使用更简单的点符号是否可以,或者如果我不使用指针间接'^',我会遇到麻烦吗?也许这是众所周知的行为,但这是我第一次遇到它。
答案 0 :(得分:9)
省略插入符号是完全合理和安全的。当然,逻辑需要插入符号,但由于表达式x.value
本身没有有意义的解释,编译器会假设您实际上是x^.value
。此功能是所谓的“扩展语法”的一部分。你可以阅读这个at the documentation。
答案 1 :(得分:4)
当Extended syntax生效时(默认值),您可以在引用指针时省略插入符号。
答案 2 :(得分:4)
近二十年来,Delphi一直支持这种语法。使用.
运算符时,编译器将隐式应用^
运算符。两种风格都是正确的。您的程序没有机会做错事,因为^
的存在与否都不会影响后续.
运算符的解释。
虽然此行为由“扩展语法”选项控制,但永远不会禁用该选项。您可以放心地依赖它在所有上下文中设置。它还控制隐式Result
变量的可用性,以及字符指针与数组语法兼容的方式。
答案 3 :(得分:1)
这称为结构化类型的隐式指针解除引用并从Delphi 1继承。此语言扩展旨在使类访问成员(类为structured types且实例也是隐式的指针)仅通过成员资格运算符(.
),避免了对显式解除引用运算符(^
)的要求。
您可以放心地在所有Delphi编译器中依赖此扩展的存在。为了获得更大的灵活性,您可以使用$IFOPT X+
条件指令测试此扩展的存在。