2009-11-18 44 views
58

Sự khác biệt giữa ++$i$i++ bằng PHP là gì?

Trả lời

69

++$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.

+0

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

+6

Đâ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

+0

... 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

9
++$i //first increment $i then run line 
$i++ //first run line then increment $i 
+0

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 –

3

Để giải thích điểm jldupont của:

$i = 1; 
$x = $i++; 
echo $x; // prints 1 
$x = ++$i; 
echo $x; // prints 3 
4

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 
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 
34

++$i là pre-incrementation

  1. $i được tăng
  2. giá trị mới được trả lại

$i++ là hậu incrementation

  1. giá trị của $i sao chép vào một biến tạm thời nội
  2. $i được tăng
  3. bản nội bộ của người già giá trị của $i được trả lại
25

++$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; 
1

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.

3

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 
9

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) 
*/ 
+0

Đ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

0

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++'; 
3

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:

  1. 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
  2. $ Biến i sẽ được tăng lên
  3. 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ể).

+0

Được thăng hạng để đề xuất sử dụng tiền tố trừ khi cần phải có một postfix. – developerbmw

2

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 

?> 
+0

Cảm ơn ví dụ đơn giản. Giờ thì tôi đã hiểu. – Praditha

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