2013-04-05 10 views
7

Sto cercando di capire la differenza concettuale tra chiamata per riferimento, valore e nome.Chiama per riferimento, valore e nome

così ho il seguente pseudocodice:

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

Cos'è X, Y e Z dopo la chiamata pippo se a, b e c sono tutti chiamata per riferimento? se a, b e c sono call-by-value/result? se a, b e c sono call-by-name?

Un altro scenario:

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, X); 

che sto cercando di ottenere un vantaggio sulla studiando per un imminente finale e questo sembrava una buona problema recensione di andare oltre. Il pass-by-name è sicuramente il più estraneo per me.

+2

Passa il mouse sui tag che hai appena inserito nella domanda e osserva le descrizioni. Non ho mai sentito nominare per nome, a meno che non si tratti di una specie di Riflessione. –

+0

Passa per nome: http://stackoverflow.com/questions/838079/what-is-pass-by-name-and-how-does-it-work-exact –

+1

Sai quali sono i puntatori? Passare per riferimento è solo il passaggio di un puntatore mentre passando per il valore sta passando il valore stesso. – Pithikos

risposta

5

Quando si passa un parametro per valore, si copia semplicemente il valore all'interno del parametro della funzione e qualsiasi cosa venga eseguita con quella variabile all'interno della funzione non riflette la variabile originale ad es.

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 
//printing will print the unchanged values because variables were sent by value so any //changes made to the variables in foo doesn't affect the original. 
print X; //prints 1 
print Y; //prints 2 
print Z; //prints 3 

ma quando trasmettiamo i parametri per riferimento, esso copia l'indirizzo della variabile che significa qualunque facciamo con le variabili all'interno della funzione, viene effettivamente fatto nella locazione di memoria originale esempio

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

print X; //prints 2 
print Y; //prints 5 
print Z; //prints 52 

per il passaggio per nome; Pass-by-name

+0

per il pass-by-reference, la cosa passata deve essere un lvalue (cioè essere assegnabile). 'Y + 2' non è un lvalue, quindi non sono sicuro di cosa significherebbe assegnarlo. – newacct

0

Questo non cambierà il valore di X, Y o Z se è pass-by-value. Quando si utilizza una funzione come "foo()", sostanzialmente copia le variabili (x, y e z) in altre variabili (a, b e c) e fa alcune azioni con esse, senza cambiare gli originali (x, y e z). Per di cambiare un valore che avrebbe dovuto restituire un valore, qualcosa di simile:

foo(a, b, c) 
{ 
a = a++; 
b = b++; 
c = a + b * 10; 
return c; 
} 

x = 1; 
y = 2; 
z = 3; 
z = foo(x, y+2) 

Poi x e y sarebbe lo stesso, ma z sarebbe (x + 1) + (y + 1) * 10 che in questo caso sarebbe 32.

1

In base al valore: non è possibile modificare la funzione. tutte le tue azioni scompaiono al termine della funzione.

Per riferimento, le tue azioni cambiano effettivamente le variabili. Per nome - non ho mai sentito ...

Passaggio x + 1 non è il cambiamento, dice solo per la funzione 3 invece 2 o ecc ...

0

in javascript:

  1. tipo primitivo variabile come stringa, il numero viene sempre passato come passaggio in base al valore.
  2. Array e Object vengono passati come pass per riferimento o come valore in base a queste condizioni.

    • se si modifica il valore di tale oggetto o matrice con nuovo oggetto o matrice, passa per valore.

      object1 = {item: "car"}; array1=[1,2,3];

    qui si sta assegnando nuovo oggetto o array.you non stanno cambiando il valore della proprietà della vecchia object.so esso è passaggio per valore.

    • se si modifica un valore di proprietà di un oggetto o di un array, viene passato per riferimento.

      object1.item= "car"; array1[0]=9;

    qui si cambia un valore di proprietà di vecchio object.you non intendono assegnare nuovo oggetto o array di vecchio one.so è passaggio per riferimento.

Codice

function passVar(object1, object2, number1) { 

     object1.key1= "laptop"; 
     object2 = { 
      key2: "computer" 
     }; 
     number1 = number1 + 1; 
    } 

    var object1 = { 
     key1: "car" 
    }; 
    var object2 = { 
     key2: "bike" 
    }; 
    var number1 = 10; 

    passVar(object1, object2, number1); 
    console.log(object1.key1); 
    console.log(object2.key2); 
    console.log(number1); 

Output: - 
    laptop 
    bike 
    10 
2

chiamata per valore: modo normale ... valori dei parametri attuali vengono copiati parametri formali.

Chiamata tramite riferimento: anziché i parametri, i loro indirizzi vengono passati ei parametri formali puntano ai parametri effettivi.

Chiama per nome: come i macro, l'intera definizione di funzione sostituisce la chiamata di funzione ei parametri formali sono solo un altro nome per i parametri effettivi.

Problemi correlati