Sự khác biệt giữa ++$i
và $i++
bằng PHP là gì?
Trả lời
++$i
được tăng trước trong khi $i++
sau tăng.
- pre-increment: biến gia tăng
i
trước và sau đó không tham chiếu. - hậu increment: de-tài liệu tham khảo và sau đó tăng
i
"Tận dụng lợi thế của một thực tế rằng PHP cho phép bạn gửi-increment ($ i ++) và pre-increment (++ $ i) Ý nghĩa là miễn là bạn không phải là viết bất cứ thứ gì như $ j = $ i ++, tuy nhiên việc tăng trước gần 10% nhanh hơn, có nghĩa là bạn nên chuyển từ bài đăng sang trước gia tăng khi bạn có cơ hội, đặc biệt là trong các vòng chặt chẽ và đặc biệt là nếu bạn là người hiểu biết về việc tối ưu hóa vi mô! " - TuxRadar
Để biết rõ hơn, sau incrementation trong PHP đã được ghi nhận như lưu trữ một biến tạm thời mà các thuộc tính để overhead này 10% so với trước incrementation.
++$i //first increment $i then run line
$i++ //first run line then increment $i
Thats về mặt kỹ thuật một sự đơn giản hóa - suy nghĩ của một vòng lặp cho vv –
Để giải thích điểm jldupont của:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
Difference là: ++$i
sẽ tăng $i
biến và trở về giá trị được cập nhật, trong khi $i++
sẽ trở lại giá trị ban đầu, do đó tăng nó.
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
Có thể minh họa tốt nhất bằng ví dụ ...
Post-increment:
$zero = 0;
$n = $zero++; //$n is zero
Pre-increment:
$zero = 0;
$n = ++$zero; //$n is one
++$i
là pre-incrementation
$i
được tăng- giá trị mới được trả lại
$i++
là hậu incrementation
- giá trị của
$i
sao chép vào một biến tạm thời nội $i
được tăng- bản nội bộ của người già giá trị của
$i
được trả lại
++$i
gia số $i
, nhưng đánh giá giá trị của $i+1
$i++
gia số $i
, nhưng đánh giá giá trị cũ là $i
.
Dưới đây là một ví dụ:
$i = 10;
$a = $i++;
// Now $a is 10, and $i is 11
$i = 10;
$a = ++$i;
// Now $a is 11, and $i is 11
Có đôi khi là một chi phí preformance nhẹ cho việc sử dụng $i++
. Thấy chưa, khi bạn làm điều gì đó như
$a = $i++;
Bạn đang thực sự làm điều này:
$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;
Câu trả lời ngắn:
- Tiền tố làm tăng giá trị và trả về giá trị tăng
- Postfix tăng giá trị và trả về giá trị trước khi được tăng
- Prefix nhanh
Long trả lời: Nếu bạn nghĩ một chút về nó, làm thế nào bạn sẽ thực hiện những chính mình, bạn có thể sẽ nhận ra lý do tại sao tiền tố là nhanh hơn. Sự thật để mà nói, postfix là thực sự (thường xuyên) thực hiện sử dụng tiền tố:
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
Tránh postfix trừ khi bạn có một lý do cụ thể không. Sự khác biệt về tốc độ có thể khá nhiều đối với các kiểu dữ liệu phức tạp.
Tôi thực sự đã xem xét điều này một vài ngày trước.Heres my source.
Một cách khác để xem trước và sau tăng lên là viết tắt để kết hợp 2 câu lệnh.
Pre-incrementing
// long form
$y = $y + 1;
$x = $y; // any statement using $y
// shorthand
$x = ++$y; // the same statement using $y
Post-incrementing
// long form
$x = $y; // any statement using $y
$y = $y + 1;
// shorthand
$x = $y++; // the same statement using $y
trong trường hợp này không có sự khác biệt:
for($i = 0;$i<3;++$i)var_dump $i;
/*
int(0)
int(1)
int(2)
*/
for($i = 0;$i<3;$i++)var_dump $i;
/*
int(0)
int(1)
int(2)
*/
nhưng:
for($i = 0;$i<3; $j = ++$i)var_dump($j);
/*
NULL
int(1)
int(2)
*/
for($i = 0;$i<3; $j = $i++)var_dump($j);
/*
NULL
int(0)
int(1)
*/
Điều này rất hữu ích, tăng tiền tố dường như có ít bất ngờ nhất. Tôi sẽ chuyển sang luôn sử dụng tăng tiền tố ngay bây giờ. – CMCDragonkai
Tôi chạy đoạn mã sau để kiểm tra nếu ++ $ i nhanh hơn 10% so với $ i ++. Tôi thừa nhận, mã không có kết quả ổn định nhưng thậm chí sau đó tôi ít nhất cũng đã thấy một số con số gần 10%. Mức cao nhất tôi nhận được là khoảng 4-4,5%.
<?php
$randomFloat = rand(0, 10)/10;
$before1 = microtime(true);
for($i=0; $i <1000000; ++$i){
$rand = (rand(0, 10)/10) * (rand(0, 10)/10);
}
$after1 = microtime(true);
echo 'it took '.($after1-$before1) . ' seconds fot ++$i<br />';
$before2 = microtime(true);
for($i=0; $i <1000000; $i++){
$rand = (rand(0, 10)/10) * (rand(0, 10)/10);
}
$after2 = microtime(true);
echo 'it took '.($after2-$before2) . ' seconds fot $i++<br /><br />';
echo '++$i is '.((($after1-$before1)*100)/($after2-$before2)-100).'% faster than $i++';
Mục đích chính của các nhà điều hành tăng sau sửa chữa là sử dụng như thế này:
while(*condition*)
$array[$i++] = $something;
Đây là một cách rất thanh lịch, làm thế nào để có được xung quanh một số lần lặp mảng. Breakdown:
- Biến $ một cái gì đó sẽ được giao cho các phần tử mảng lập chỉ mục với $ i
- $ Biến i sẽ được tăng lên
- Iteration là lúc kết thúc, trạng sẽ được kiểm tra
Trong tất cả các trường hợp khác, bạn nên sử dụng toán tử tiền tố. Nó làm cho mã rõ ràng hơn nhiều (Bạn có thể chắc chắn rằng bạn đã làm việc với giá trị gia tăng của biến cụ thể).
Được thăng hạng để đề xuất sử dụng tiền tố trừ khi cần phải có một postfix. – developerbmw
ví dụ này elplains đơn giản
<?php
$x = 10;
echo $x++. ' '.$x; // the result is 10 and 11
echo "<br>";
$y = 10;
echo ++$y. ' ' .$y; // the result is 11 and 11
// so the $x++ is not showing +1 at first but the next time
// and the ++y is showing +1 first time but not increasing next
?>
Cảm ơn ví dụ đơn giản. Giờ thì tôi đã hiểu. – Praditha
- 1. khác biệt giữa i = ++ i và i ++
- 2. Sự khác biệt giữa int * i và int ** i
- 3. sự khác biệt giữa int * i và int * i
- 4. `` i` và `? -i` trong regex có nghĩa là gì?
- 5. Có sự khác biệt nào giữa i == 0 và 0 == i không?
- 6. sự khác biệt giữa printf ("% i") và printf ("% d")
- 7. sự khác biệt giữa các cổng I/O và bộ nhớ I/O
- 8. Sự khác biệt giữa% i và% d bằng Python là gì?
- 9. "i" trong "hàm (i)" trong mã JavaScript sau là gì?
- 10. php, sự khác nhau giữa strtolower và mb_strtolower là gì?
- 11. Sự khác nhau giữa querySelector và getElementsByTagName là gì?
- 12. Sự khác nhau giữa "$ (this)" và "this" là gì?
- 13. Điều này có nghĩa là gì? int i = (i = 20);
- 14. ++ i + ++ i + ++ i trong Java vs C
- 15. Sự khác biệt giữa nhị phân và văn bản I/O trong python trên Windows
- 16. Sự khác nhau giữa static_cast và reinterpret_cast là gì?
- 17. sự khác nhau giữa GLOBALS và GLOBAL là gì?
- 18. Sự khác nhau giữa crc32 và crc32b là gì?
- 19. Sự khác nhau giữa MySQL, MySQLi và PDO là gì?
- 20. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 21. Sự khác nhau giữa == và = trong Prolog là gì?
- 22. Sự khác nhau giữa // và /// trong Visual Studio là gì?
- 23. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 24. Sự khác nhau giữa * và. * Trong MATLAB là gì?
- 25. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 26. Sự khác nhau giữa: = và = trong MySQL là gì?
- 27. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 28. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 29. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 30. Sự khác nhau giữa java và jsp là gì?
Tôi thực sự quan tâm đến nguồn gốc của báo giá của bạn. 10% dường như rất nhiều với tôi – knittl
Đây có phải là một nguyên tắc chung của ngón tay cái hay là PHP cụ thể. – Zoidberg
... nguồn được liệt kê trong câu trả lời của tôi. Tôi đã không kiểm tra nó ra bản thân mình ... Tôi đoán tôi có thể bằng cách nhìn vào mã nguồn cho PHP mặc dù ... – jldupont