è PHP e C++ solo 2 posti che abbiamo bisogno di attenzione su quello che appare come pass-by-value è, infatti, il passaggio per riferimento?

StackOverflow https://stackoverflow.com/questions/937585

Domanda

è PHP e C++ solo 2 posti che abbiamo bisogno di attenzione sul passaggio di una semplice variabile del tipo di dati, come un argomento di una funzione e il valore può essere modificato?

come

$count = 2;
foo($count);
echo $count;

e la linea 3, echo $visualizzazione del conteggio qualcosa di diverso da 2.Io so solo di PHP e C++ in cui può accadere.C'è qualche altro posto dove può succedere?

Aggiornamento: che è, ciò che appare come "passare dal valore" è, infatti, "passaggio per riferimento".Se è il passaggio di un oggetto in Java, Perl, PHP, Python e Ruby, è automaticamente il passaggio per riferimento e le variabili di istanza' i valori dell'oggetto può essere modificato.Che cosa circa il passaggio in non-oggetto?

È stato utile?

Soluzione

Molte altre lingue il supporto di tale "passaggio per riferimento" -- Perl, Fortran, Pascal, Visual Basic, ...

Quelli che ti interessano di più, beh, è difficile per noi dire!-)

Edit:Nel tuo aggiornamento, è mettere in Java e Python nella stessa categoria, ma che è sbagliato:non si poteva riprodurre il tuo esempio con (Java):

  int count = 2;
  whatever(count);
  /* count here is CERTAIN to be still 2 */

o (Python):

count = 2
whatever(count)
# count here is CERTAIN to be still 2

Python e Java lo stile è a volte conosciuto come "oggetto il riferimento" (piuttosto che "con riferimento alla variabile"):ciò che è passato (o ricevuto) è un riferimento all'oggetto (quindi SE l'oggetto ha mutator il chiamato può invocare mutator e quindi modificare l'oggetto), NON una "variabile", in modo che dopo la chiamata variabile, se del caso, utilizzato per passare l'argomento, comunque, si riferisce allo stesso oggetto, mai ad un altro oggetto).Questa distinzione è molto chiaro a che vedere con gli oggetti immutabili, come (in Java e Python) numeri e stringhe.

Altri suggerimenti

Non è possibile modificare una variabile in C ++ meno che non si esplicitamente definirlo come riferimento. Se si dispone di argomenti (non) di riferimento regolari, sono le copie e possono non essere cambiati. Se andate a leggere e capire l'API, allora non c'è bisogno di essere attenti a passare una variabile di tipo di dati semplice come argomenti della funzione .

void func(type & arg);

può essere cambiato e

void func(type arg);

non può. E di solito in C ++ non sarà un argomento di riferimento a meno che l'API vuole è il valore da modificare nella (parametro di uscita) il primo posto.

E come Alex già detto ci sono molte lingue che supportano il passare per riferimento idioma.

Si avrebbe solo bisogno di attenzione se una lingua lo rende non Cancella se una variabile viene passata per valore o con riferimento .

Torna ai vecchi tempi, FORTRAN passati costanti per riferimento. È possibile passare la costante 2 ad una subroutine e la subroutine possibile assegnare 3 ad esso. Poi dopo il ritorno, questo codice

x = 2 + 2

fisserebbe x a 6. Io non so se moderni compilatori FORTRAN permettono che ciò accada.

A seguito della discussione di cui sopra, di recente ho appreso che y utilizzare il design linguaggio di programmazione del termine "pass-by-reference" è piuttosto molto severa, e per esempio in Java è infatti proprio pass-by-value, rigorosamente.

entrambi i casi, si passa un primitivo per valore (chiaro a tutti ho supposto) oppure si passa un riferimento a un oggetto per valore. Ok ho capito che la società ancora considerare il seguente codice Perl.

sub addFoo {
  my ($arrayRef) = @_;
  push @{$arrayRef},"foo"; 
}

my @array = (1,2,3);
my $arrayRef; # FUTURE reference (equivalent to pointer C) to @array.

addFoo($arrayref = \@array); #1.
addFoo(\@array); #2.
addFoo($arrayRef); #3.

print join(" ",@array),"\n"; # result "1 2 3 foo foo foo\n";

La mia domanda se quale delle tre chiamate alternative per addFoo, è considerato passaggio per riferimento al contrario di Pass-a-di riferimento? Sembra che la risposta è chiara per il numero tre, ma non posso dire per il numero # 1. # 2. come stanno facendo esattamente la stessa cosa. Almeno il numero 2 è considerato in modo esplicito come pass-by-di riferimento in alcune pagine man perl e siti web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top