2015-11-07 14 views
5

Supponiamo che io sono un metodo:stampa qualcosa in un metodo del valore-ritorno

public static int square(int x) { 
    System.out.print(5); 
    return x*x; 
} 

io chiamo questo metodo nel metodo principale come segue:

System.out.print("The square of the number "+7+" is "+square(7)); 

mi aspetto l'uscita per essere

The square of the number 7 is 549 

Tuttavia, l'uscita reale è

5The square of the number 7 is 49 

Perché succede?

+0

forse perché '7 * 7' è' 49' –

+2

@JarrodRoberson: Guardate il suo codice di nuovo, in particolare la posizione del '5' – Claudiu

+0

i risultati attesi sarebbe esattamente quello che è dovrebbe be '5Il quadrato del numero 7 è 49' –

risposta

-2

Si hanno due opzioni: si restituisce il valore che si desidera stampare dal metodo oppure si esegue semplicemente System.out.print all'interno del metodo.

Vuoi veramente stampare 5 da square?

10

Quando si chiama una funzione, tutti gli argomenti vengono valutati prima di chiamare la funzione.

Quindi "The square of the number "+7+" is "+square(7) viene valutato prima dello System.out.print che lo stampa.

Così square(7) viene chiamato, che quindi chiama System.out.print(5)primo - prima che il chiamante System.out.print.

Dopo square(7) restituisce 49, la stringa restituisce "The square of the number 7 is 49", che viene quindi stampata.

Per rendere ancora più esplicito è come se avete fatto queste cose:

String toPrint = "The square of the number "+7+" is "+square(7); 
System.out.print(toPrint); 
+0

Ho una domanda, lo stackframe del metodo 'square' viene assegnato dopo lo stackframe del metodo' System.out.print', o prima di esso? – Sean

+0

@Sean: I * credo * che 'square' è chiamato, lo stackframe è allocato, la funzione viene eseguita completamente, restituisce il risultato, lo stackframe è deallocato, ecc., Tutti prima della chiamata esterna a' System.out.print (" Il quadrato ... 'inizia anche ad accadere (sicuramente prima che venga assegnato il suo stack frame.) – Claudiu

+0

ya, è logico, tutto ciò che è accaduto prima che il parametro fosse copiato nello stack di' System.out.print' – Sean

-1

L'uscita si stanno ottenendo è corretto.

5The square of the number 7 is 49 

Se si ha il tempo per imparare ad utilizzare un debugger passo si dovrebbe rendersi conto che si stampa un 5 allora stampare The square of the number 7 is 49

Quindi l'uscita si stanno ottenendo è corretto.

Se si desidera ciò che si sta chiedendo è necessario.

System.out.print("The square of the number "+7+" is 5"+square(7)) 
4

La linea System.out.print("The square of the number "+7+" is "+square(7)); compila a:

System.out.print(new StringBuilder() 
       .append("The square of the number ") 
       .append(7) 
       .append(" is ") 
       .append(square(7)) 
       .toString()); 

In combinazione con il metodo di square(), la sequenza di chiamate di metodo che si potrebbe vedere se si piede attraverso il codice con un debugger è:

new StringBuilder() 
append("The square of the number ") 
append(7) 
append(" is ") 
square(7) 
    print(5) 
append(49)         <-- value returned by square 
toString() 
print("The square of the number 7 is 49") <-- value returned by toString 

Come potete vedere, chiama print(5), quindiprint("The square of the number 7 is 49"), risultante nell'output:

5The square of the number 7 is 49 
Problemi correlati