2013-05-30 76 views
6

我遇到過以前沒有注意過的德爾福語言。考慮一個簡單的記錄和一個指向該記錄:通過訪問Delphi記錄字段。或者^

TRecord = record 
    value : double; 
end; 
PTRecord = ^TRecord; 

現在宣佈型PTRecord的變量:

var x : PTRecord; 

,並創建一些空間:

x := new (PTRecord); 

我注意到,我可以使用'。'來訪問值字段。符號和'^'。符號。因此,下面兩行看起來在操作上是等效的,編譯器不會抱怨,並且運行時正常工作:

x.value := 4.5; 
x^.value := 2.3; 

我原以爲'^'是獲取價值的正確方法嗎?我的問題是,如果我不使用指針間接'^。',可以使用更簡單的點符號還是會遇到麻煩?也許這是衆所周知的行爲,但這是我第一次遇到它。

回答

9

這是完全可靠和安全的省略脫字符。當然,邏輯要求插入符號,但由於表達式x.value本身沒有有意義的解釋,因此編譯器會認爲你的意思實際上是x^.value。這個特性是所謂的「擴展語法」的一部分。你可以閱讀關於這個at the documentation

+0

有趣的是,我不知道擴展的語法。感謝您的鏈接。 – rhody

+0

它被引入了對象,然後擴展到記錄 –

4

Extended syntax有效(缺省值)時,可以在引用指針時省略插入符號。

4

德爾福支持接近二十年的語法。當您使用.運算符時,編譯器將隱式應用^運算符。兩種風格都是正確的。您的程序沒有機會做錯事,因爲沒有任何情況存在或不存在^將影響後續.運營商的解釋。

儘管此行爲受「擴展語法」選項控制,但沒有任何人曾經禁用該選項。您可以放心地依靠它在所有情況下設置。它還控制變量的隱式Result的可用性,以及字符指針與數組語法兼容的方式。

1

這被稱爲隱式指針引用的結構化類型和從在Delphi 1.本語言擴展的目的是使訪問的類繼承的成員(類structured types並且還實例是隱式的指針)由成員運算手段(.),避免需要明確的解引用運算符(^)。

您可以放心地依賴所有Delphi編譯器中的擴展名。爲了獲得更大的靈活性,您可以使用$IFOPT X+條件指令來測試是否存在此擴展。

+0

這個解釋聽起來很吸引人,但是。操作員仍然在X模式下工作 –

相關問題