2010-01-31 4 views
6

Solo una breve domandatermine comune per il "valore-based" operatore OR

printf("%d", 99 || 44) prints "1" in C 
print 99 || 44 prints "99" in perl 

Ci sono due diversi tipi di valutazione. Ognuno ha un nome?

modifica: sono interessato a sapere come viene comunemente chiamata questa valutazione Perl rispetto a C. Quando si dice "C esempio è X, e perl esempio non è X, ma Y" quali parole useresti per X e Y. "cortocircuito" non è quello che sto cercando.

+2

Un termine comune per due operazioni che hanno effetti diversi? Non è come chiedere se esiste un termine comune per mele e arance? Sembra un po 'contraddittorio. – jalf

+2

@Jalf: Sta chiedendo un termine _common per questi due tipi di ** valutazione ** _, la risposta non dovrebbe essere "Valutazione del cortocircuito"? –

+1

Non ne sono sicuro. La valutazione del cortocircuito è la caratteristica a cui è interessato? Potrebbe anche essere "logico" o "int-to-bool conversion". Le due righe di codice hanno molto in comune, ma ci sono anche alcune importanti differenze. Non sono proprio sicuro di quale OP desideri un termine comune * per * – jalf

risposta

6

La versione C utilizza || come l'OR logico tra i due valori. Sia 44 e 99 restituiscono true in C in quanto non sono 0, per cui il risultato di un OR tra loro ritorna 1 (AKA true in C)

In quel frammento particolare Perl, || è il null-coalescing operator, un binario che valuta il secondo argomento se il primo è nullo, altrimenti valuta il primo argomento. Poiché 99 è il primo argomento e non null, viene restituito e stampato.

MODIFICA: Grazie Evan per la claficazione: Il || l'operatore in perl non è l'operatore a coalescenza nulla, restituisce l'RHS se l'LHS viene valutato come falso, mentre altri restituiscono l'LHS. // è l'operatore "corretto" a coalescenza nulla.

Ecco l'elenco dei valori in Perl che considerato falso (from wikipedia)

$false = 0; # the number zero 
$false = 0.0; # the number zero as a float 
$false = 0b0; # the number zero in binary 
$false = 0x0; # the number zero in hexadecimal 
$false = '0'; # the string zero 
$false = ""; # the empty string 
$false = undef; # the return value from undef 
$false = 2-3+1 # computes to 0 which is converted to "0" so it is false 
+4

re: * In quel particolare frammento di perl, || è l'operatore a coalescenza nulla, un binario che valuta il secondo argomento se il primo è nullo * - È certamente ** NOT ** null-coalescing. Sì, 'undef || morirà, morirà, ma così sarà '0 || die'. '||' valuta l'LHS e se restituisce false valuta l'RHS. undef proprio per caso vale la pena valutare (grazie a dio). Al contrario, '//' è l'operatore a coalescenza nulla introdotto in 5.10 che * * attiverà il RHS solo se l'LHS è nullo, prima di quello che si potrebbe fare '(definito $ a) || die' –

+1

* Il || l'operatore in perl non è l'operatore a coalescenza nulla, restituisce il LHS se il primo valuta il falso, altrimenti restituisce il primo argomento. * In realtà, come tutte le istruzioni in Perl restituisce l'ultima espressione valutata che è sempre l'ultimo argomento con '' ||. Dai un'occhiata a questo 'perl -e'print 0 ||" 0 "|| undef'' da vedere. –

3

In Perl, 99 || 44 restituisce 99, perché || è "cortocircuito" e se il suo primo argomento è vero nel contesto booleano, lo restituisce solo. print stampe 99.

In C il risultato di || è logico che passate a printf risultati in 1 o 0. È inoltre corto circuito, quindi 44 non è nemmeno valutato.

+7

C || è anche in cortocircuito. Si limita a 1 o zero. –

+0

@ Roger: certo, grazie. modificato per rendere più chiaro –

8

Leggi here.

Binario || esegue un funzionamento logico OR di cortocircuito. Cioè, se l'operando di sinistra è vero, l'operando di destra non viene neppure valutato. Il contesto scalare o di lista si propaga all'operando di destra se valutato.

In Perl || e & & gli operatori differiscono da quelli di C in quanto, anziché restituire 0 o 1, restituiscono l'ultimo valore valutato.


printf ("% d", 99 || 44) stampe "1" in C

Questo perché 99||44 restituisce true (solo 99 (che è diverso da zero) viene valutato a causa dell'azione di cortocircuito di ||) il cui equivalente è 1 quindi printf() stampe 1.

stampa 99 || 44 stampe "99" in perl

.. Invece di restituire 0 o 1, viene restituito l'ultimo valore valutato (99).

+0

@stereofrog: La tua domanda era _è un ** termine comune ** per questi due tipi di valutazione? _. La mia risposta è la valutazione di cortocircuito. Non risponde alla tua domanda? A proposito di chi ha downvoted, per favore spiega il motivo? –

+1

stereofrog: Guarda di nuovo, ha risposto, la differenza è un dettaglio di implementazione. C restituisce 1 per "true", mentre perl restituisce l'ultimo valore diverso da zero che valuta per "true". –

1

Sia C e Perl fanno riferimento ai rispettivi || operatori come "logica OR" (distinta da un bit-wise OR) Non esiste un nome speciale per il comportamento di Perl di restituire l'ultimo valore opposto a 0 o 1.

9

Come si nota, le parole che si cercano sono non "cortocircuito". La valutazione di cortocircuito significa che nell'espressione

e1 || e2 

se l'espressione e1 viene valutata a qualcosa che rappresenta la verità, quindi non è necessario valutare e2. Sia C che Perl utilizzano la valutazione di cortocircuito.

Sono consapevole della distinzione che si ottiene in due diversi sapori di cortocircuito O, ma in venti anni di lavoro in linguaggi di programmazione non ho mai visto queste cose nominate. La versione Perl è abbastanza popolare nelle lingue dinamiche, ad esempio Icon, Lua, Scheme.

La versione Perl è quasi esprimibili in C:

e1 ? e1 : e2 

Purtroppo questa versione può valutare e1 due volte, a seconda del ottimizzatore — e se e1 ha effetti collaterali, o se il compilatore non può dire se lo potrebbe avere effetti collaterali, allora il compilatore è richiesto per valutarlo due volte. Questo difetto può essere risolto legando il valore di e1 a una nuova variabile locale, ma richiede un'estensione GNU.

Il comportamento C può essere emulato in Perl da

!!(e1 || e2) 
0

In C, || è un'operazione booleana . In Perl è un numero intero di tipo agnostico che avviene per trattare il primo argomento come un valore booleano. Questa è l'unica distinzione.

+0

Sicuro che si tratti di un'operazione intera in Perl? Che dire di '$ s =" ciao "|| "" ''? – Frunsi

+0

@frunsi: Lol, non conosco la terminologia del tipo di Perl. – Potatoswatter