2012-06-13 9 views
14

क्या ऑर्डर जिसमें पैरामीटर की गणना किसी प्रक्रिया से पहले की जाती है जिसे डेल्फी में परिभाषित किया जाता है?डेल्फी में, किसी विधि में पारित होने पर पैरामीटर का मूल्यांकन किया जाता है?

IOW, अगर मैं इस बदसूरत कोड (कुछ इस तरह पाया एक विरासत आवेदन में) है ...

function A(var err: integer): integer; 
begin 
    err := 42; 
    Result := 17; 
end; 

Test(A(err), err); 

... टेस्ट मानकों (17, 42) प्राप्त करने की गारंटी दी है या यह भी कर सकता है हो (17, अपरिभाषित)?


संपादित करें:

हालांकि डेविड का उदाहरण 32-बिट और 64-बिट संकलक के साथ भिन्न परिणाम देता है, इस (सौभाग्य से) मेरी विरासत कोड को प्रभावित नहीं करता है क्योंकि टेस्ट (ए (गलती), अरे) रजिस्टर में 'गलती' के पते को स्टोर करता है और इससे कोई फर्क नहीं पड़ता कि संकलक ए (गलती) या उसके बाद कॉल करने से पहले करता है या नहीं।

+2

यह लेख रुचि का हो सकता http://blog.barrkel.com/:

इस का एक दिलचस्प प्रदर्शन के रूप में, निम्नलिखित कार्यक्रम विभिन्न उत्पादन है कि क्या आप 32 या 64 बिट कोड को लक्षित के आधार पर किया गया है 2008/04/सी-मूल्यांकन-ऑर्डर-gotcha.html –

+1

इसके बारे में एक और पोस्ट: http://stackoverflow.com/questions/3054526/delphi-compiler-directive-to-evaluate-arguments-in-reverse –

+0

@ डेविड, मुझे इस सी 'फीचर' से अवगत था और मैंने एसओ पर सीखा कि जावा और सी # बाएं से दाएं से मूल्यांकन करते हैं लेकिन मुझे याद नहीं आया कि डेल्फी ने यह दस्तावेज कहाँ किया है (और जैसा कि हमने सीखा है, दस्तावेज गलत है)। – gabr

उत्तर

12

डेल्फी में पैरामीटर मूल्यांकन का क्रम परिभाषित नहीं किया गया है।

program ParameterEvaluationOrder; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

function SideEffect(A: Integer): Integer; 
begin 
    Writeln(A); 
    Result := A; 
end; 

procedure Test(A, B: Integer); 
begin 
end; 

begin 
    Test(SideEffect(1), SideEffect(2)); 
    Readln; 
end. 
+0

विन 64 में, मूल्यांकन का आदेश एक और केवल कॉलिंग कन्वेंशन, AFAIK द्वारा परिभाषित किया गया है। Win32 में, अलग-अलग कॉलिंग सम्मेलन होते हैं, और वे मूल्यांकन के क्रम को निर्दिष्ट नहीं करते हैं, केवल पास करने का आदेश। –

+4

@RudyVelthuis मेरे सबसे अच्छे ज्ञान के लिए, सम्मेलन कॉलिंग * पास * के आदेश निर्दिष्ट करते हैं लेकिन * मूल्यांकन * के आदेश निर्दिष्ट नहीं करते हैं। तो मैं उस टिप्पणी पर विवाद करता हूं। –

+0

आईएमओ, कॉलिंग सम्मेलन जो भी वे चाहते हैं, डब्लूआरटी कॉलिंग कार्यों को निर्दिष्ट कर सकते हैं। यदि मूल्यांकन का आदेश भी निर्दिष्ट किया गया है, प्लेटफॉर्म डेवलपर के किसी भी कारण से, आप बेहतर चश्मे का पालन कर सकते हैं। लेकिन मैं मानता हूं कि, AFAIK, अब तक, किसी भी कॉलिंग सम्मेलन ने ऐसा नहीं किया है। –

5

संपादित: ऐसा लगता है कि संकलक व्यवहार सहायता में वर्णित का उल्लंघन हो सकता है:

Calling Conventions मदद विषय (जोर मेरा) से:

रजिस्टर और पास्कल सम्मेलनों से पैरामीटर पास बाएं से दाएं; यानी, बाएं सबसे पैरामीटर मूल्यांकन और पहले पारित किया गया और सही पैरामीटर का मूल्यांकन किया गया और अंतिम रूप से पारित किया गया।

+0

यह पता चला है कि आप जिस दस्तावेज़ से लिंक करते हैं वह गलत है। –

+0

यह एक दुखी करता है कि संकलक का व्यवहार केवल आधिकारिक दस्तावेज़ीकरण स्रोत – MBo

+0

से संबंधित नहीं है। मुझे व्यक्तिगत रूप से लगता है कि मूल्यांकन आदेश को अनिर्धारित करने के लिए यह ठीक है, लेकिन दस्तावेज़ीकरण अन्यथा नहीं बताया जाना चाहिए। –

संबंधित मुद्दे

 संबंधित मुद्दे