2012-05-06 20 views

Trả lời

7

PHP không phải là C, vì vậy 'a' + 1 không phải là 'b'.

'a' trong ngữ cảnh số là 00+1 = 1.

php> echo (int)'a'; 
0 

Thực tế là các nhà khai thác tăng postfix/prefix làm làm việc như thế nào nếu đó là một C char có vẻ là một "tính năng" khó chịu của PHP. Đặc biệt là kể từ khi các toán tử giảm dần là một không-op trong trường hợp này.

Khi bạn tăng 'z' nó được thậm chí tệ hơn:

php> $a = 'z'; 
php> echo ++$a 
aa 
+0

Ý của bạn là gì? : "Đặc biệt là kể từ khi các nhà khai thác giảm dần là một no-op trong trường hợp này". – Shubham

+1

Thực ra, tôi sẽ không gọi nó là kỳ quặc. Về cơ bản, nó tuân theo các quy tắc toán học tiêu chuẩn bằng cách sử dụng cơ sở 25 (với các chữ thay vì số). – Mario

+0

@Shubham "No-op" có nghĩa là "không hoạt động", tức là không có gì xảy ra. Nó được giải thích ở đây ngay trước ví dụ đầu tiên: http://php.net/manual/en/language.operators.increment.php – Mario

1

Lý do là PHP xử lý các biến trong một cách đặc biệt ngữ cảnh. Nó hơi giống với Visual Basic.

Biểu thức 'a' + 1 sử dụng tính toán bổ sung. Trong bối cảnh này a được hiểu là một số, vì vậy nó sẽ được coi là 0 (nếu bạn đã quen thuộc với C, nó giống như ăn chuỗi "a" vào atoi()).

Nếu bạn muốn sử dụng cụm từ 'a' . 1 kết quả sẽ là a1 do sử dụng nối chuỗi.

Để nhận kết quả bạn mong đợi (b), bạn phải sử dụng chr(ord('a') + 1), trong đó ord() trả về giá trị ASCII của ký tự (đầu tiên) một cách rõ ràng.

$a++ là trường hợp đặc biệt, về bản chất là quá tải xem giá trị ascii thay vì giá trị chính nó làm biến.

0

Khi bạn thực hiện thêm, PHP cố gắng chuyển đổi 'a' thành số nguyên. Cũng giống như nếu bạn sử dụng atoi trong C, 'a' được intepreted là 0. Do đó 0 + 1 là 1.

+0

Có, nhưng tại sao '$ a ++' thay đổi giá trị '$ a' thành' b' chứ không phải '1'? – JJJ

+0

Tăng thêm không giống như thao tác bổ sung. PHP tuân theo quy ước của Perl. Xem phần này: http://php.net/manual/en/language.operators.increment.php – root

1

Từ http://php.net/manual/en/types.comparisons.php, "a" +1 được thực thi là 0 + 1. Trong trường hợp một số ngôn ngữ (C#) sẽ dịch (string) + (int) thành (string) + (string), PHP ngược lại: (int) + (int).

Để buộc nối chuỗi thay thế: "a" . 1 sản lượng 'a1'.

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