Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe

Rudi231

Mitglied
Hallo liebe Community,
ich habe hier eine Probeklausuraufgabe bei der ich nicht die vollständige Lösung weiß.
Die Aufgabe:
Wie lautet die Ausgabe, wenn die Parameterübergabe an die Methode xyz call-by-value, call-by-reference bzw. call-by-name ist
Das Programm für die Aufgabe befindet sich unten.

Ich weiß nur die Ausgabe für Call-by-Value. Die wäre: 10 20 30
2

Wie die Ausgabe für Reference und Name ist weiß ich leider nicht.
Danke für eure Hilfe im vorraus.

Java:
public class CallBy2 {
     static int i = 0;
     static void xyz(int a, int b) {
          ++a;
          ++i;
          a = b;
          a = b;
     }
     public static void main(String[] args) {
          int[] n = { 10, 20, 30 };
          xyz(n[i], ++i);
          for (int i : n)
                 System.out.print(i + "\t");
         System.out.println();
         System.out.println(i);
     }
}
 
Hallo
Ich würde mal Call-By-Ref anschauen. Ich nehme an, du weisst, was das bedeutet?
Die nachfolgenden Operationen zeigen dir den Wert in n[0]
Java:
static void xyz(int a, int b) { // a ref auf n[0], b ref auf i
          ++a;  // n[0] = 11
          ++i; // i = 2
          a = b; // n[0] = i = 2
          a = b; // n[0] = i = 2
     }
public static void main(String[] args) {
          int[] n = { 10, 20, 30 };
          xyz(n[i], ++i); // n[i] = n[0] = ref auf 10, i vor xyz-Aufruf = 1
          for (int i : n)
                 System.out.print(i + "\t");
         System.out.println();
         System.out.println(i);
     }
Als Ausgabe würde ich folgendes erwarten: 2, 20, 30, 2
Kannst es ja mal in c/cpp probieren.

Call-By-Name kenne ich im Kontext von Java ehrlich gesagt nicht, es geht dort anscheinend um den Zeitpunkt, wann ein Ausdruck evaluiert wird.
Call-By-Value: Vor Funktionsaufruf einmal
Call-By-Name: Für jede Verwendung separat und by ref:
Java:
static int i = 0;
     static void xyz(int a, int b) {
          ++a; // Zugriff auf n[0] als Ref, n[0] = 11
          ++i; // i = 1, b wurde ja noch nicht verwendet
          a = b; // n[1] = ++i = 2
          a = b; // n[2] = ++i = 3
     }
     public static void main(String[] args) {
          int[] n = { 10, 20, 30 };
          xyz(n[i], ++i); // Noch nichts auswerten
          for (int i : n)
                 System.out.print(i + "\t");
         System.out.println();
         System.out.println(i);
     }
In dem Fall würde ich das Folgende erwarten: 11, 2, 3, 3
Sieh dir dazu die beiden Links an:
Link 1
Link 2

Ich hoffe, ich konnte dir damit ein wenig helfen und liege selbst nicht falsch mit meinen Lösungen 😉
 

Neue Themen


Zurück
Oben