2011-08-03 14 views
8

PHP:en Perl y PHP

$a = 2; 
$b = 3; 
if($b=1 && $a=5) 
{ 
    $a++; 
    $b++; 
} 
echo $a.'-'.$b; 


$a = 2; 
$b = 3; 
if($a=5 and $b=1) 
{ 
    $a++; 
    $b++; 
} 
echo $a.'-'.$b; 

salida 6-16-2 .I no entienden el 1 aquí.

Perl:

$a = 2; 
$b = 3; 
if($b=1 && $a=5) 
{ 
    $a++;                    
    $b++; 
} 
print $a.'-'.$b; 


$a = 2; 
$b = 3; 
if($a=5 and $b=1) 
{ 
    $a++; 
    $b++; 
} 
print $a.'-'.$b; 

salida 6-66-2, no entiendo el segundo 6 aquí.

¿Alguien sabe el motivo?

En realidad sé que && tiene una precedencia mayor que and, pero aún tengo la duda al saber esto antes de la mano.

ACTUALIZACIÓN

Ahora entiendo el PHP uno, ¿qué pasa con el Perl?

Respuesta

10

Respecto Perl:

A diferencia de PHP (pero como Python, JavaScript, etc.) los operadores booleanos no devuelven un valor booleano pero el valor que hizo la expresión verdadera (o el último valor) determina el resultado final de la expresión (source).

$b=1 && $a=5 

se evalúa como

$b = (1 && $a=5) // same as in PHP 

que es el mismo que $b = (1 && 5) (asignación "retornos" el valor asignado) y asigna 5-$b.


La conclusión es: La prioridad de los operadores es la misma en Perl y PHP (al menos en este caso), pero difieren en lo que valor es devuelto por los operadores booleanos.

FWIW, la precedencia del operador de PHP se puede encontrar here.


Lo que es más interesante (al menos esto era nuevo para mí) es que PHP no realiza conversión de tipo para los operadores de incremento/decremento.

Así que si $b es true, entonces $b++ deja el valor como true, mientras que, por ejemplo,$b += 1 asigna 2 a $b.


†: Lo que quiero decir con esto es que se devuelve el primer valor (más a la izquierda), que

  • evalúa a false en caso de &&
  • evalúa a true en caso de ||

o el último valor de la expresión.

+0

En Python, devuelve primero false-converted a false o lo último por exceso. Creo que Perl hará lo mismo – RiaD

+0

@JeRog - una expresión '&&' dejará de evaluar cuando se encuentre un valor falso, entonces en '1 && 0 && 5',' 0' es el último valor. Del mismo modo, '1 && undef && 5' se evaluará a' undef'. – mob

+1

@Je Rog '&&' devuelve su argumento izquierdo si su argumento de la izquierda es falso; de lo contrario, devuelve su argumento correcto. '||' devuelve su argumento izquierdo si su argumento izquierdo es verdadero; de lo contrario, devuelve su argumento correcto. Entonces, una cadena de '&&' devuelve el valor falso más a la izquierda (o el último valor si todos son verdaderos) y una cadena de '||' devuelve el valor verdadero más a la izquierda (o el último valor si todos son falsos). – hobbs

6

Primer ejemplo

$a = 2; 
$b = 3; 
if($b=1 && $a=5) // means $b = (1 && $a=5) 
{ 
    var_dump($b); //bool(true) because of && 
    $a++; 
    $b++; //bool(true)++ ==true, ok 
} 
echo $a.'-'.$b; 

espero que no va a usar esos códigos en la producción)

soy novato en Perl, pero puedo sugerir una & & b devuelve un ob (último de ellos si todos ellos convertidos a bool), no boolean, a continuación, $ b = (1 & & $ a = 5) devuelve $ b = 5 (es 5)

+0

+ 1, entiendo el '1' ahora. –

+0

Esto es muy perspicaz, pero no llega a responder la pregunta del OP. ¿Por qué php considera '$ b' ser booleano? ¿Y qué diablos está haciendo perl en el ejemplo de OP? – Asaph

+0

Hace que te preguntes si al poner la asignación en un PHP condicional sugerido que quieres un booleano en lugar de un número, por lo que se convierte al tipo equivocado ... –

4

aquí está la cuestión: 1 & & 5 5 retornos en Perl. obtendrá el resultado que espera si codifica el condicional como if(($b=1) && ($a=5))

2

Para Perl, fig. 2: and tiene una prioridad muy baja en Perl, no es un sinónimo de &&. Por lo tanto, la muestra se ejecuta como (($a = 5) and ($b = 1)) que establece $ a y $ b a 5 y 1 respectivamente y devuelve un valor del último argumento (es decir, 1).

Después de ++ obtienes 6-2.

Cuestiones relacionadas