2012-07-19 40 views
6

Hành vi này có đúng trong PHP không?Ưu tiên đúc loại PHP

<?php echo '-' . 1 + 1 . ' crazy cats'; ?> 
// Outputs: 
0 crazy cats 

Tôi hiểu rằng dấu trừ đang được ghép với '1' và '-1' đầu tiên được đúc thành số nguyên chứ không phải '2' thành chuỗi.

Vui lòng giải thích lý do.

Cách tốt nhất để giải quyết nó là gì? Cái này?

<?php echo '-' . (string)1 + 1 . ' crazy cats'; ?> 
+0

ngạc nhiên đây không phải là dupe .. vì vậy 1 – Louis

Trả lời

1

Nếu bạn thích, điều này tránh được ưu tiên:

printf('-%d crazy cats',1+1); 
6

Trước hết, đó là chính xác và nếu nó khác thì cũng đúng, đó là cách các nhà phát triển PHP đã xác định ưu tiên toán hạng.
Trong kịch bản này, không có toán hạng có độ ưu tiên, vì vậy u đọc nó trái sang phải

  1. '-' . 1 ==> '-1'
  2. '-1' + 1 ==> 0 (phép toán số học trên dây, sẽ cố gắng để ném những kẻ ác để số đầu tiên và sau đó làm arithmetics).
  3. 0 . ' crazy cats' ==> "0 crazy cats" (chuỗi hoạt động trên số, sẽ truyền chúng thành chuỗi).
+2

Argh, bạn đã nhanh hơn tôi :) BTW, điều hành ưu tiên có sẵn tạihttp: // php.net/manual/en/language.operators.precedence.php. –

1

Sự bực bội của bạn bị tắt. Các '-' không được đúc nhưng concated.

PHP sẽ vẫn xử lý (string) 1-1 làm số nguyên.

.+/- có cùng quyền ưu tiên trong PHP, do đó, chuỗi có thể được đọc từ trái sang phải.

Trên đây là tương tự như nói:

echo '-1' + '1 crazy cats'; 
+0

Trừ phi không được đúc tất nhiên, đã sửa câu hỏi. – Paker

4

Nếu bạn muốn -2 mèo điên, bạn có thể thiết lập các thao tác ưu tiên với ngoặc:

echo '-' . (1 + 1) . ' crazy cats'; 
3

echo cũng theo cấu trúc của echo 'foo', 'bar' mà phân tách các mục thành các câu lệnh riêng biệt để lặp lại. Bạn không phải lo lắng về thứ tự nối trong trường hợp đó.

Vì vậy, bạn có thể làm <?php echo '-', (1 + 1), ' crazy cats'; ?> và mèo của bạn sẽ không quan tâm đến các từ khóa phủ định!