php 递增函数,递增/递减运算符 - [ php中文手册 ] - 在线原生手册 - php中文网

用户评论:

[#1]

aluciffer at hotmail dot com [2014-10-10 09:27:28]

Regarding character incrementing and PHP following Perl's convention with character operations.

Actually i found that there is a difference, and incrementing and decrementing unfortunately does not yield the reverse, expected results.

For example, the following piece of code:

for ($n=0;$n<10;$n++) {

echo ++$s.' ';

}

echoPHP_EOL;

for ($n=10;$n>0;$n--) {

echo (--$s) .' ';

}?>

Will output:

== Alphabets ==

X Y Z AA AB AC AD AE AF AG

AG AG AG AG AG AG AG AG AG AG

Please note that the decrement operator has no effect on the character or string.

On the other hand, in Perl, the similar script:

#!/usr/bin/perl

my $s = 'W';

foreach (1 .. 10) {

print  ++$s . " ";

}

print "\n";

foreach (1 .. 10) {

print --$s . " ";

}

Will output:

X Y Z AA AB AC AD AE AF AG

-1 -2 -3 -4 -5 -6 -7 -8 -9 -10

[#2]

michiel ed thalent circle nl [2012-08-24 07:39:15]

BEWARE:

If incrementing an uninitialized variable you will not get an E_NOTICE error. This may caused you to not find issue's like the visibility of a property.

private$foo=1;

}

classbextendsa{

public functioninc() {

echo ++$this->foo;

}

}$b= newb;$b->inc();?>

Will output 1 and not 2 (if $foo was accessible).

Also no notices are given.

[#3]

hartmut at php dot net [2012-08-02 15:28:54]

Note that

$a="9D9"; var_dump(++$a);   => string(3) "9E0"

but counting onwards from there

$a="9E0"; var_dump(++$a);   => float(10)

this is due to "9E0" being interpreted as a string representation of the float constant 9E0 (or 9e0), and thus evalutes to 9 * 10^0 = 9 (in a float context)

[#4]

johnnythan at nospam dot gmx dot com [2011-11-22 04:05:09]

If you have a trailing zero and use the increment, the trailing zero will not remain. Was at least unexpected for me at first, although it's logical if you think about it.

$start='01';$start++;

print$start;//Outputs '2' not '02'?>

[#5]

Brad Proctor [2010-11-06 20:51:21]

I ran some tests (on PHP 5.3.3) of my own and was surprised to find $i += 1 to be the fastest method of incrementing.  Here are the methods fastest to slowest:

$i += 1;

++$i;

$i++;

$i = $i + 1;

[#6]

dsbeam at gmail dot com [2009-08-31 15:35:24]

When using the ++ operator by itself on a variable, ++$var is faster than $var++ and uses slightly less memory (in my experiments).  It would seem like this could be optimized in the language during runtime (if $var++ is the only thing in the whole statement, it could be treated as ++$var).

I conducted many tests (I believe to be fair), and here's one of the results:

$i++ took 8.47515535355 seconds and 2360 bytes

++$i took 7.80081486702 seconds and 2160 bytes

Here's my code.  If anyone sees a bias in it, tell me.  I conducted it many times, each time going through a loop one million iterations and doing each test 10 - 15 times (10 - 15 million uses of the ++ operator).

ini_set('MAX_EXEC_TIME',120);ob_start( );$num_tests=10;$startFirst=$startSecond=$endFirst=$endSecond=$startFirstMemory=$endFirstMemory=$startSecondMemory=$endSecondMemory=$someVal=0;$times= array('$i++'=> array('time'=>0,'memory'=>0),'++$i'=> array('total'=>0,'memory'=>0) );

for($j=0;$j

{

for($i=0,$startFirstMemory=memory_get_usage( ),$startFirst=microtime(true);$i<10000000;$i++ ){$someval=2; }$endFirstMemory=memory_get_usage( );$endFirst=microtime(true);

for($i=0,$startSecondMemory=memory_get_usage( ),$startSecond=microtime(true);$i<10000000; ++$i){$someval=2; }$endSecondMemory=memory_get_usage( );$endSecond=microtime(true);$times['$i++'][$j] = array('startTime'=>$startFirst,'endTime'=>$endFirst,'startMemory'=>$startFirstMemory,'endMemory'=>$endFirstMemory);$times['++$i'][$j] = array('startTime'=>$startSecond,'endTime'=>$endSecond,'startMemory'=>$startSecondMemory,'endMemory'=>$endSecondMemory);

}

for($i=0;$i

{$times['$i++']['time'] += ($times['$i++'][$i]['endTime'] -$times['$i++'][$i]['startTime'] );$times['++$i']['time'] += ($times['++$i'][$i]['endTime'] -$times['++$i'][$i]['startTime'] );$times['$i++']['memory'] += ($times['$i++'][$i]['endMemory'] -$times['$i++'][$i]['startMemory'] );$times['++$i']['memory'] += ($times['++$i'][$i]['endMemory'] -$times['++$i'][$i]['startMemory'] );

}

echo'There were '.$num_tests.' tests conducted, here\'s the totals

$i++ took '.$times['$i++']['time'] .' seconds and '.$times['$i++']['memory'] .' bytes

++$i took '.$times['++$i']['time'] .' seconds and '.$times['++$i']['memory'] .' bytes';ob_end_flush( );?>

Try it yourself, ;)

[#7]

sneskid at hotmail dot com [2009-08-07 15:49:23]

(related to what "Are Pedersen" wrote)

With arrays it can lead to much confusion if your index variable is altered on the right side of the = sign, either with ++|-- or even when passed to a function by reference..

Consider these (PHP 5):

$A[$a] = ++$a;// [1]=1$B[++$b] = ++$b;// [1]=2$C[$c+=0] = ++$c;// [0]=1?>

In 'A' you have to be aware that PHP evaluates $A[$a] last.

Yet in 'B' and 'C' PHP evaluates the index and saves it in a temporary variable.

You can always force PHP to evaluate a variable without explicitly storing it as a named variable first, with a simple "+=0" like in example 'C'.

Compared to 'A', 'C' gives the more logically expected result, when we expect evaluation occurs left to right.

PHP does evaluate left to right BUT it will attempt to cut down on temporary variables, which can lead to confusing results.

So just be aware and use either behavior to your advantage for the desired functionality.

[#8]

cleong at letstalk dot com [2001-10-17 19:52:17]

Note that the ++ and -- don't convert a boolean to an int. The following code will loop forever.

function a($start_index) {

for($i = $start_index; $i 

}

a(false);

This behavior is, of course, very different from that in C. Had me pulling out my hair for a while.

[#9]

fred at surleau dot com [2001-07-18 12:02:19]

Other samples :

$l="A";      $l++; -> $l="B"

$l="A0";     $l++; -> $l="A1"

$l="A9";     $l++; -> $l="B0"

$l="Z99";    $l++; -> $l="AA00"

$l="5Z9";    $l++; -> $l="6A0"

$l="9Z9";    $l++; -> $l="10A0"

$l="9z9";    $l++; -> $l="10a0"

$l="J85410"; $l++; -> $l="J85411"

$l="J99999"; $l++; -> $l="K00000"

$l="K00000"; $l++; -> $l="K00001"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值