2011-08-03 2 views
8

PHP:question de la priorité des opérateurs en Perl et 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; 

sortie 6-16-2 .Je ne comprends pas le 1 ici.

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; 

sortie 6-66-2, je ne comprends pas ici la deuxième 6.

Quelqu'un connaît la raison?

En fait, je sais que && a une priorité supérieure and, mais je doute a encore quand on sait cela avant la main.

MISE À JOUR

Maintenant, je comprends le PHP un, à propos de ce que celui Perl?

Répondre

10

Perl en ce qui concerne:

Contrairement à PHP (mais comme Python, JavaScript, etc.) les opérateurs booléens ne retournent pas de valeur booléenne mais la valeur a rendu l'expression true (ou la dernière valeur) détermine le résultat final de l'expression (source).

$b=1 && $a=5 

est évaluée comme

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

qui est le même que $b = (1 && 5) (affectation « rendement » de la valeur attribuée) et attribue 5-$b.


La ligne de fond est la suivante: La priorité de l'opérateur est le même en Perl et PHP (au moins dans ce cas), mais ils diffèrent en ce que la valeur est renvoyée par les opérateurs booléens.

FWIW, la priorité de l'opérateur PHP peut être trouvée here.


Ce qui est plus intéressant (au moins cela était nouveau pour moi) est que PHP ne fonctionne pas de conversion de type pour les opérateurs d'incrémentation/décrémentation.

Donc, si $b est true, alors $b++ laisse la valeur true, alors que par exemple$b += 1 attribue 2 à $b.


†: Ce que je veux dire ce que retourne la première valeur (à gauche), qui

  • évalue à false en cas de &&
  • évalue à true en cas de ||

ou la dernière valeur de l'expression.

+0

En Python, il retourne d'abord faux-converti en faux ou en dernier overwise. Je pense que Perl fait la même chose – RiaD

+0

@JeRog - une expression '&& 'arrête d'évaluer quand une valeur fausse est rencontrée, donc dans' 1 && 0 && 5', '0' est la dernière valeur. De même, '1 && undef && 5' évaluera' undef'. – mob

+1

@Je Rog '&&' retourne son argument de gauche si son argument de gauche est faux; Sinon, il renvoie son bon argument. '||' retourne son argument de gauche si son argument de gauche est vrai, sinon il retourne son argument de droite. Donc une chaîne de '&&' retourne la valeur fausse la plus à gauche (ou la dernière valeur si tout était vrai) et une chaîne de '||' retourne la valeur vraie la plus à gauche (ou la dernière valeur si toutes étaient fausses). – hobbs

6

Premier exemple

$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; 

espère que vous ne pourrez pas utiliser ces codes dans la production)

Je suis Noob en Perl, mais je peux suggérer une & & b retourne a ou b (dernier d'entre eux, si tous les convertis en bool), non booléen, $ b = (1 & & $ a = 5) retourne $ b = 5 (5 est)

+0

+ 1, je comprends le «1» maintenant. –

+0

Ceci est très perspicace, mais ne répond pas à la question de l'OP. Pourquoi php considère '$ b' comme un booléen? Et que diable fait Perl dans l'exemple de l'OP? – Asaph

+0

Vous vous demandez si vous placez l'assignation dans un PHP conditionnel que vous voulez un booléen au lieu d'un nombre, donc il a moulé au mauvais type ... –

4

est ici la question: 1 & & 5 5 retours en Perl. vous obtenez le résultat attendu si vous codez le conditionnel if(($b=1) && ($a=5))

2

Pour Perl, fig. 2: and a une très faible priorité en perl, ce n'est pas un synonyme de &&. Par conséquent, l'exemple est exécuté sous la forme (($a = 5) and ($b = 1)) qui définit $ a et $ b respectivement à 5 et 1 et renvoie une valeur du dernier argument (c'est-à-dire 1).

Après ++ vous obtenez 6-2.

Questions connexes