Was ist der Rückgabewert von f (p, p), wenn der Wert von p vor dem Aufruf auf 5 initialisiert wird? Beachten Sie, dass der erste Parameter als Referenz übergeben wird, während der zweite Parameter als Wert übergeben wird.ist undefiniertes Verhalten in gegebenem Code?
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
Optionen sind:
Ich versuche zu erklären:
In diesem Code wird es vier rekursive Aufrufe mit Parametern sein (6,4), (7,3), (8,2) und (9,1). Der letzte Aufruf gibt 1 zurück. Aber aufgrund des Verweises ist x in allen vorherigen Funktionen jetzt 9. Daher wird der von f (p, p) zurückgegebene Wert 9 * 9 * 9 * 9 * 1 = 6561.
Diese Frage ist von der Wettbewerbsprüfung GATE (see Q.no.-42). Der Antwortschlüssel wird durch GATE "Markiert für alle" angegeben (bedeutet, dass keine Option korrekt ist). key set-C, Q.no.-42. Irgendwo erklärt als:
In GATE 2013 wurden Marken für alle gegeben, da der gleiche Code in C/C++ undefiniertes Verhalten erzeugt. Dies liegt daran, dass *
kein Sequenzpunkt in C/C++ ist. Der richtige Code muss
return f(x,c) * x;
mit
res = f(x,c);
return res * x;
Aber der gegebenen Code funktioniert gut. Ist Gates Schlüssel falsch? Oder ist wirklich der Fehler bei der Frage?
Eines der Dinge, die passieren können, wenn Sie die Straße überqueren, ohne in beide Richtungen zu schauen, ist, dass Sie es sicher auf die andere Seite schaffen. Aber es ist ein Fehler, * vorherzusagen *, dass eine Person, die die Straße überquert, ohne in beide Richtungen zu sehen, sicher zur anderen Seite gelangt. –
Ähnlich wie [Sequenzpunkt Ambiguität, undefined Verhalten?] (Http://StackOverflow.com/Q/29513572/1708801) –