2010-01-31 17 views
6

Sólo una pregunta rápidatérmino común para el "basada en el valor" operador OR

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

Hay dos tipos diferentes de evaluación. ¿Cada uno tiene un nombre?

editar: me interesa saber cómo se suele llamar a esta evaluación de Perl en comparación con C. Cuando dice "C ejemplo es X y el ejemplo perl no es X, sino Y" qué palabras usaría para X y Y. "cortocircuito" no es lo que estoy buscando.

+2

¿Un término común para dos operaciones que tienen diferentes efectos? ¿No es esto como preguntar si hay un término común para las manzanas y las naranjas? Parece un poco contradictorio. – jalf

+2

@Jalf: Él está pidiendo un término _common para estos dos tipos de ** evaluación ** _, ¿no debería la respuesta ser "Evaluación de corto circuito"? –

+1

No estoy seguro. ¿La evaluación de cortocircuito es el rasgo en el que está interesado? Podría ser "lógica o", o "conversión de int-a-bool". Las dos líneas de código tienen mucho en común, pero también hay algunas diferencias importantes. No estoy seguro de lo que el OP quiere un término común * para * – jalf

Respuesta

6

La versión C usa || como el OR lógico entre los dos valores. Ambos 44 y 99 evaluar a true en C ya que no son 0, por lo que el resultado de una o entre ellas devuelve 1 (AKA true en C)

En ese fragmento particular, Perl, || es el null-coalescing operator, un binario que evalúa el segundo argumento si el primero es nulo, de lo contrario se evalúa para el primer argumento. Como 99 es el primer argumento y no es nulo, se devuelve e imprime.

EDIT: Gracias Evan por la clafication: The || el operador en perl no es el operador de coalescencia nula, devuelve el RHS si el LHS lo evalúa como falso, de lo contrario devuelve el LHS. // es el operador "coherente" nulo "adecuado".

Aquí está la lista de valores en Perl que evaluar en false (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: * En ese fragmento de Perl particular, || es el operador nulo-coalescente, un binario que evalúa el segundo argumento si el primero es nulo * - Sin duda es ** NO ** nulo-coalescente. Sí, 'undef || morir' morirá, pero también lo hará '0 || morir'. '||' evalúa el LHS y si devuelve falso, evalúa el RHS. undef simplemente pasa a evaluar a falso (gracias a Dios). Por el contrario, '//' es el operador nulo-coalescente introducido en 5.10 que * solo * activará el RHS si el LHS es nulo, antes de eso usted podría hacer '(definido $ a) || die' –

+1

* The || operador en perl no es el operador de fusión nula, devuelve el LHS si el primero lo evalúa como falso, de lo contrario devuelve el primer argumento. * En realidad, como todas las declaraciones en Perl, devuelve su última expresión evaluada, que siempre es el último argumento con '||'. Mira esto 'perl -e'print 0 ||" 0 "|| undef'' para ver. –

3

En Perl, 99 || 44 devuelve 99, porque || es "cortocircuito" y si su primer argumento es verdadero en contexto booleano, simplemente lo devuelve. print grabados 99.

En C el resultado de || es lógico, que pasaron a printf resultados ya sea en 1 o 0. También es cortocircuitos, por lo que 44 ni siquiera se evaluaron.

+7

C's || está en cortocircuito también. Simplemente evalúa a 1 o cero. –

+0

@Roger: claro, gracias. lo editó para que sea más claro –

8

Lee here.

Binary || realiza una operación O lógica de cortocircuito. Es decir, si el operando de la izquierda es verdadero, el operando de la derecha ni siquiera se evalúa. El contexto escalar o de lista se propaga al operando derecho si se evalúa.

En Perl || y & & operadores difieren de C en que, en lugar de devolver 0 o 1, devuelven el último valor evaluado.


printf ("% d", 99 || 44) grabados "1" en C

Eso es porque 99||44 vuelve verdadera (sólo 99 (que no es cero) se evalúa debido a la acción de cortocircuito de ||) cuyo equivalente es 1, por lo tanto, printf() imprime 1.

print 99 || 44 impresiones "99" en Perl

..rat que regrese 0 o 1, se devuelve el último valor evaluado (99 aquí).

+0

@stereofrog: Su pregunta fue: ¿hay un ** término común ** para estos dos tipos de evaluación? _. Mi respuesta es la evaluación de cortocircuito. ¿No responde tu pregunta? Por cierto, quien revocó, por favor explique la razón? –

+1

stereofrog: Mire nuevamente, respondió, la diferencia es un detalle de implementación. C devuelve 1 para "verdadero", mientras que perl devuelve el último valor distinto de cero que evalúa para "verdadero". –

1

Tanto C y Perl se refieren a sus respectivos || operadores como una "lógica OR" (a diferencia de un bit a bit OR) . no hay un nombre especial para el comportamiento de devolver el último valor en contraposición a 0 ó 1.

9

como nota de Perl, las palabras que están buscando se no "cortocircuito". evaluación de cortocircuito significa que en la expresión

e1 || e2 

si la expresión e1 se evalúa como algo que representa la verdad, entonces no es necesario evaluar e2. Tanto C como Perl usan evaluación de cortocircuito.

Soy consciente de la distinción que usted hace en dos sabores diferentes de cortocircuito O, pero en veinte años de trabajo en lenguajes de programación nunca he visto nombrar estas cosas. La versión de Perl es bastante popular en los lenguajes dinámicos, por ejemplo, Icon, Lua, Scheme.

La versión Perl es casi expresable en C:

e1 ? e1 : e2 

Desafortunadamente esta versión puede evaluar e1 dos veces, dependiendo del optimizador — e1 y si tiene efectos secundarios, o si el compilador no puede decir si es podría tener efectos secundarios, entonces el compilador es requerido para evaluarlo dos veces. Este defecto se puede arreglar vinculando el valor de e1 a una variable local nueva, pero eso requiere una extensión GNU.

El comportamiento C se puede simular en Perl por

!!(e1 || e2) 
0

En C, || es una operación booleana. En Perl, es entero operación agnóstica de tipo que ocurre al tratar el primer argumento como un valor booleano. Esa es la única distinción.

+0

¿Seguro que se trata de una operación entera en Perl? ¿Qué pasa con '$ s =" hola "|| "" '? – Frunsi

+0

@frunsi: Lol, no sé la terminología de tipos de Perl. – Potatoswatter

Cuestiones relacionadas