Qual è il valore di ritorno di f (p, p), se il valore di p è inizializzato su 5 prima della chiamata? Si noti che il primo parametro è passato per riferimento, mentre il secondo parametro viene passato per valore.È un comportamento non definito nel codice specificato?
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
Le opzioni sono:
cerco di spiegare:
In questo codice, ci saranno quattro chiamate ricorsive con parametri (6,4), (7,3), (8,2) e (9,1). L'ultima chiamata restituisce 1. Ma a causa del passaggio per riferimento, x in tutte le precedenti funzioni è ora 9. Quindi, il valore restituito da f (p, p) sarà 9 * 9 * 9 * 9 * 1 = 6561.
Questa domanda proviene dal concorso GATE, (see Q.no.-42). Il tasto di risposta è dato da GATE "Segni a tutti" (significa che non c'è alcuna opzione corretta) key set-C, Q.no.-42. Somewhere ha spiegato come:
In GATE 2013 i marchi sono stati assegnati a tutti come lo stesso codice in C/C++ produce un comportamento non definito. Questo perché *
non è un punto di sequenza in C/C++. Il codice corretto deve sostituire
return f(x,c) * x;
con
res = f(x,c);
return res * x;
Ma il codice data funziona bene. La chiave di GATE è sbagliata? O è davvero l'errore con la domanda?
Una delle cose che possono accadere se si attraversa la strada senza guardare in entrambi i modi è che si arriva dall'altra parte in modo sicuro. Ma è un errore * prevedere * che una persona che attraversa la strada senza guardare in entrambi i modi lo farà passare dall'altra parte in modo sicuro. –
Simile all'ambiguità del punto di sequenza, comportamento non definito?] (Http://stackoverflow.com/q/29513572/1708801) –