2013-08-13 4 views
-2

Я не понимаю, почему эта инструкция будет выводить 5. И как это сделает интерпретатор PHP.Оператор Приоритет и ассоциативность

$a = (1 << 0); 
$b = (1 << $a); 
$c = (1 << $b); 

echo ($c || $b) << 2 * $a | $a; //5 
+1

Вы читали это? http://php.net/manual/en/language.operators.precedence.php –

+0

Единственное, что прямо не доступно для чтения на указанной выше странице, это '($ c || $ b)' => 'true' => '1' – Wrikken

ответ

1
$a = (1 << 0);  // 1 
$b = (1 << $a); // doesnt matter, not used 
$c = (1 << $b); // doesnt matter, not used 

echo ($c || $b) << 2 * $a | $a; //5 
// ($c || $b) will return true, meaning 1 
// so you can rewrite it as 
echo 1 << 2 * $a | $a 
// $a = 1, so: 
echo 1 << 2 * 1 | 1 
// or: 
echo 1 << 2 | 1 
// -> 
echo 4 | 1 // = 5 
+0

thx, но есть еще одна инструкция, которую я не понимаю – Abir

+0

$ a = (1 << 0); $ b = (1 << 1); echo ($ b | $ a) << 2; // 3 ??? – Abir

+0

Я начинаю думать, что вы не понимаете | оператора. я попытаюсь объяснить. вы делаете (1 | 2). в двоичном коде 1 есть «001», а 2 в двоичном формате: «010», когда вы используете | каждый бит сравнивается, и когда один из бит равен 1 (или оба), это приведет к 1. значению (001 | 010) = 011, которое является двоичным значением для 3 в десятичном значении. Надеюсь, это имеет смысл для вас. – Elpy

1

Its решен так:

echo (($c || $b) << (2 * $a)) | $a; 

и это только некоторые выход из моего теста:

php > $a = (1 << 0); 
php > echo $a; 
1 

php > $b = (1 << $a); 
php > echo $b; 
2 

php > $c = (1 << $b); 
php > echo $c; 
4 

php > echo ($c || $b); 
1 

php > echo ($c || $b) << 2 * $a | $a; 
5 

php > echo (($c || $b) << (2 * $a)) | $a; 
5