2016-12-12 17 views
7

Czy ktoś może wyjaśnić, dlaczego te 2 dają taki sam wynik?php sam wynik dodając inną liczbę vars

$a = 1; 
$c = $a + $a++; 
var_dump($c);//int(3) 

i

$a = 1; 
$c = $a + $a + $a++; 
var_dump($c);//int(3) 

Testowane PHP 7.1. Zrewidowane zrzuty Opcji dla obu przypadków, ale wciąż nie mogę tego zrozumieć. Jeśli dodamy więcej $ vars do wyrażenia, wynik będzie oczekiwany.

+0

I może wskazywać, że jest podobny do tego 'var_dump ((int) ((0.1 + 0.7) * 10)); // int (7)' ([a problem precyzji pływaka] (http://titanic.fauser.edu/php/lang uage.types.float.php.htm # warn.float-precision)). Ale naprawdę nie wiem. –

+0

Zobacz także https://3v4l.org/3bWI0 – bishop

+1

Zostało to wyjaśnione tutaj: https://gist.github.com/nikic/6699370 Prawdopodobnie istnieje również jeden lub dziesięć duplikatów na SO. – NikiC

Odpowiedz

8

Od PHP: Operator Precedence:

pierwszeństwo Operator i asocjatywność jedynie określić sposób wyrażenia są grupowane, nie określić kolejność oceny. PHP nie (w ogólnym przypadku) określić, w jakiej kolejności wyrazem jest oceniano i kod, który zakłada powinny należy unikać specyficzna kolejność oceny, ponieważ zachowanie może zmienić między wersjami PHP lub zależności od otaczającego kod.

Przykład # 2 Undefined kolejność oceny

$a = 1; 
echo $a + $a++; // may print either 2 or 3 

$i = 1; 
$array[$i] = $i++; // may set either index 1 or 2 

więc w pierwszym przykładzie, PHP jest oczywiście powrót 1 dla $a++ następnie zwiększając go do 2 a następnie dodanie nowego $a, który jest 2 .

W drugim przykładzie, PHP wraca 1 dla $a następnie dodając $a następnie dodając $a a następnie zwiększając go do 2.

Jak można zobaczyć tutaj: https://3v4l.org/kvrTr:

PHP 5.1.0 - 7.1.0

int(3) 
int(3) 

PHP 4.3.0 - 5.0.5

int(2) 
int(3) 
+0

jest to błąd lub funkcja? to samo dzieje się w javascript 'var a = 1; var c = a + a ++; console.log (c); var a = 1; var c = a + a + a ++; console.log (c); ' – jycr753

Powiązane problemy