2016-12-12 15 views
7

Ai có thể giải thích lý do tại sao 2 sản xuất cùng một kết quả?php cùng một kết quả thêm số lượng khác nhau của vars

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

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

Tested trong PHP 7.1. Đã xem xét các vùng mã hóa Opcode cho cả hai trường hợp nhưng vẫn không thể nhận được điểm. Nếu chúng ta thêm $ a vars vào biểu thức, nó tạo ra kết quả mong đợi.

+0

tôi có thể điểm đó là similary này 'var_dump ((int) ((0,1 + 0,7) * 10)); // int (7)' ([một vấn đề chính xác float] (http://titanic.fauser.edu/php/lang uage.types.float.php.htm # warn.float-precision)). Nhưng tôi thực sự không biết. –

+0

Xem thêm https://3v4l.org/3bWI0 – bishop

+1

Điều này được giải thích ở đây: https://gist.github.com/nikic/6699370 Có lẽ cũng có một hoặc mười bản sao trên SO. – NikiC

Trả lời

8

Từ PHP: Operator Precedence:

điều hành ưu tiên và associativity chỉ xác định cách biểu được nhóm lại, họ không chỉ định thứ tự đánh giá. PHP không (trong trường hợp chung) xác định thứ tự biểu thức là được đánh giá và mã giả định thứ tự đánh giá cụ thể nên tránh vì hành vi có thể thay đổi giữa các phiên bản PHP hoặc tùy thuộc vào xung quanh mã.

Ví dụ # 2 để Không xác định thẩm

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

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

Vì vậy, trong ví dụ đầu tiên của bạn, PHP được rõ ràng trở 1 cho $a++ sau đó incrementing nó để 2 và sau đó thêm mới $a, đó là 2 .

Trong ví dụ thứ hai của bạn, PHP đang trở lại 1 cho $a sau đó thêm $a sau đó thêm $a và sau đó incrementing nó để 2.

Như có thể thấy ở đây: 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

đây có phải là lỗi hoặc tính năng không? nó cũng xảy ra trong javascript 'var a = 1; var c = a + a ++; console.log (c); var a = 1; var c = a + a + a ++; console.log (c); ' – jycr753

Các vấn đề liên quan