Проблема приоритета операторов в Perl и PHP - PullRequest
8 голосов
/ 03 августа 2011

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;

Вывод 6-16-2. Я не понимаю 1 здесь.

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;

Вывод 6-66-2, Я не понимаю второго 6 здесь.

Кто-нибудь знает причину?

На самом деле я знаю, что && имеет более высокий приоритет, чем and, но у меня все еще естьсомневаюсь, зная об этом заранее.

ОБНОВЛЕНИЕ

Теперь я понимаю PHP, а как насчет Perl?

Ответы [ 5 ]

10 голосов
/ 03 августа 2011

Относительно Perl:

В отличие от PHP (но, как и Python, JavaScript и т. Д.), Логические операторы не возвращают логическое значение, но значение, которое сделало выражение истинным (или последнее значение) определяет конечный результат выражение ( источник ).

$b=1 && $a=5

оценивается как

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

, что совпадает с $b = (1 && 5) (присваивание «возвращает» присвоенное значение) и присваивает 5 $b.


Суть в следующем: приоритет операторов одинаков в Perl и PHP (по крайней мере, в этом случае), но они отличаются тем, какое значение возвращается булевыми операторами.

FWIW, приоритет оператора PHP можно найти здесь .


Что еще более интересно (по крайней мере, для меня это было новым), PHP не выполняет преобразование типов для операторов увеличения / уменьшения.

Таким образом, если $b равно true, то $b++ оставляет значение как true, в то время как, например, $b += 1 присваивает 2 $b.


†: Я имею в виду, что он возвращает первое (крайнее левое) значение, которое

  • оценивается как false в случае &&
  • оценивается как true в случае ||

или последнее значение выражения.

6 голосов
/ 03 августа 2011

Первый пример

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

надеюсь, что вы не будете использовать эти коды в производстве)

Я новичок в Perl, но могу предложить, что && b возвращает a или b (последний из них, есливсе они преобразуются в bool), а не в булево, тогда $ b = (1 && $ a = 5) возвращает $ b = 5 (равно 5)

4 голосов
/ 03 августа 2011

вот в чем проблема: 1 && 5 возвращает 5 в perl. вы получите ожидаемый результат, если кодируете условное выражение как if(($b=1) && ($a=5))

2 голосов
/ 03 августа 2011

Для Perl, рис.2: and имеет очень низкий приоритет в perl, это не синоним &&.Поэтому образец выполняется как (($a = 5) and ($b = 1)), который устанавливает $ a и $ b равными 5 и 1 соответственно и возвращает значение последнего аргумента (то есть 1).

После ++ вы получите 6-2.

0 голосов
/ 03 августа 2011

см. http://sillythingsthatmatter.in/PHP/operators.php для хороших примеров

...