2016-05-04 5 views
1

ich den folgenden Code bin gegeben und gefragt, was wird es in Abhängigkeit davon drucken, wie es genannt wird:Call by/Wert-Ergebnis

int a; 
procedure foo(int x){ 
x = x + 10; 
a = a + x; 
} 
procedure fie(){ 
a = 5; 
foo(a); 
print (a); 

Sie fragt nach call by value und call by value-result

Für Aufruf von Wert Ich weiß, dass es 20 erhalten würde, weil Sie am Ende 10 zu x hinzufügen, die den Wert 5 trägt, dann 15 zum Original a hinzufügen, was 20 wird.

Mein Problem ist, warum die call by value-result 15 drucken? Kann mir jemand eine gute Erklärung geben, ich bin verwirrt darüber, wie genau value-result und value voneinander unterscheiden und wie value-result tatsächlich interpretiert.

+4

Der Code, den Sie vorgestellt haben, ist nicht C. –

+3

Nur um hinzuzufügen, was @SteveSummit sagte ... gibt es kein 'procedure' Schlüsselwort in C. – Yetti99

+0

mein Fehler, nur ein falsches Tag @SteveSummit – bkennedy

Antwort

3

Das gegebene Beispiel ist nur über 'Call-by-Wert' und deshalb das gedruckte Wert ist 20. Im Falle von 'Aufruf nach Wert-Ergebnis' wird der vom Aufrufer angegebene aktuelle Parameter in den formalen Parameter des Aufrufers kopiert; Dann , wenn die Funktion der formalen Parameter ausgeführt wird, könnte überall im Funktionskörper modifiziert werden, aber nur, wenn die Funktion der modifizierten formalen Parameter austritt, wird dann zurück an den Aufrufer kopiert. Im Fall von ‚call by reference‘ ein ‚Alias‘ zwischen den formalen und tatsächlichen Parameter und jede Änderung formalen Parameter wird an den Aufrufer Parameter reflektiert erstellt wird.

Nachdem Sie den Code in einer Sprache, die 'Call-by-Value-Ergebnis'

void test(IN OUT int c; REF int d) 
{ 
    printf ("a: %d b: %d c: %d d: %d\n", a,b,c,d); 
    a = 0; b = 9; c = 4; d = 6; 
    printf ("a: %d b: %d c: %d d: %d\n", a,b,c,d); 
} 
void main(void) 
{ 
     int a = 5, b = 7; 
     test(a,b); 
     printf ("a: %d b: %d\n",a,b); 
} 

Die Ergebnisse dieser Unterstützung sollte

a: 5 b: 7 c: 5 d: 7 
a: 0 b: 6 c: 4 d: 6 // d and b are aliases, so b=9 is modified by d = 6 
a: 4 b: 6   // a replaced with value of c on function exit. 

So in Ihrem Fall sein: call by value

a = 5 bei Eingabe der Funktion

x = 5 + 10 = 15 

dann haben wir 'a' als globale Variable

a = 5 + x = 5 + 15 = 20 

dann auf Druck a = 20

bei Aufruf durch wert- Ergebnis, wenn die Funktion Eingabe

x = 5 + 10 = 15 
a = 5 + 15 = 20 

aber Wenn die Funktion zurückgegeben wird, wird der Wert, wenn x auf 'a' kopiert wird, wobei das Ergebnis a = 15 ist, dann der Druck 15

+0

@lucci der' Anruf von Wert 'Antwort ist 20, Sie haben angegeben, dass es 15 ist. Ich verstehe den 'Call by value' Ich verstehe einfach nicht, warum' call by value-result' ist 15. – bkennedy

+0

Sorry mein Fehler. Sie haben Recht im Falle von call by value das gedruckte Ergebnis ist 20 und call by value Ergebnis ist 15. – Luci

+0

können Sie den 'call by value result' Prozess erklären, ich bin verloren, warum es 15 ist. Hat es etwas zu tun mit einem Wesen eine globale Variable oder etwas? Es ergibt für mich immer noch keinen Sinn – bkennedy

2

HINWEIS: Meine bisherige Antwort war falsch. Es wurde jetzt korrigiert.

C/C++ implementieren nicht so etwas wie Call-by-Value-Ergebnis (nativ). Wie ich es verstehe, ist das ein ADA-Begriff (Arbeit an Regierungscode?). Call-By-Value würde zu 15 führen, Call-By-Reference ist die heikelste, weil Sie in Zeile 3 sowie in Zeile 4 Ihres Beispiels a ändern würden.

--EDIT--

Ich habe den folgenden Code implementiert, die meiner Meinung nach eine gültige Darstellung der Syntax beschrieben werden (ich bin nicht vertraut genug mit ADA den Test direkt zu tun, vielleicht jemand anderes kann). Wie Sie sehen werden, ist das Ergebnis für By-Value-Ergebnis 15.

#include <iostream> 


int a_v, a_r, a_vr; 

void foo_by_val(int x) 
{ 
    x = x + 10; 
    a_v = a_v + x; 
} 

void foo_by_ref(int &x) 
{ 
    x = x + 10; 
    a_r = a_r + x; 
} 

void foo_by_value_result(int &x_ref) 
{ 
    int x = x_ref; 
    x = x + 10; 
    a_vr = a_vr + x; 
    // x = x_ref; <-- My previous mistake 
    x_ref = x; 
} 


void fie(){ 
    a_v = 5; 
    a_r = 5; 
    a_vr = 5; 


    foo_by_val(a_v); 
    foo_by_ref(a_r); 
    foo_by_value_result(a_vr); 


    std::cout << "By Value: " << a_v << std::endl; 
    std::cout << "By Refference: " << a_r << std::endl; 
    std::cout << "By Value Result: " << a_vr << std::endl; 

} 

int main() 
{ 
    fie(); 
    return 0; 
} 

Ergebnis:

By Value: 20 
By Reference: 30 
By Value Result: 15