Home  >  Article  >  Backend Development  >  i++的问题

i++的问题

WBOY
WBOYOriginal
2016-06-23 14:04:16877browse

int I = 3;
I = I + I++ + ++I;
以上代码在Java/C#/JavaScript中均输出11,但在PHP中却输出12,PHP的计算和替他三种有什么不同?百思不得其解,求指点!


回复讨论(解决方案)

按照PHP就变成

3+4+5了~

++i 的用法(以 a=++i ,i=2 为例)
先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就是 a=i ),
则最终 a 值等于 3 , i 值等于 3 。
所以 a=++i 相当于 i=i+1 ,a=i 

i++ 的用法(以 a=i++ ,i=2 为例)
先将 i 值赋给变量 a (也就是 a=i ),然后 i 值加 1 (也就是 i=i+1 ),
则最终 a 值等于 2 ,i 值等于 3 。
所以 a=i++ 相当于 a=i , i=i+1 

按照PHP就变成

3+4+5了~


不是诶。我试了一下
  $i=3;
  $j=3;
  $k=3;
  $i=$i + $i++ + ++$i;
  $j=$j++  + ++$j + $j;
  $k=++$k + $k++ + $k;
  echo $i;
  echo $j;
  echo $k;
分别输出12 13 13

$i = 3;$a = $i + $i++ + ++$i;echo $a; //12
这是 php 的一个 BUG
似乎所有的 php5 都有这个问题(至少我手边的3个版本是这样)
问题出在第一个 $i 传值方式上,如写作
$i = 3;$a = ($d=$i) + $i++ + ++$i;echo $a; //11
就正确了
显然第一个 $i 传递的是引用,由于后边的 $i++ 实际参与运算的是 4,而不是 3

把  + ++$i 去掉就更清晰了

这样的话,会导致因为版本问题而造成不必要的错误。唉...

这样的话,会导致因为版本问题而造成不必要的错误。唉... 那倒也不是,既然php5的各个版本都是这样,也就无关紧要了。况且那样的代码也并无实际意义
真有需要时,就把 $i + $i++ 写作 2 * $i++ 也就是了

引用 5 楼 happypiggy2010 的回复:这样的话,会导致因为版本问题而造成不必要的错误。唉...那倒也不是,既然php5的各个版本都是这样,也就无关紧要了。况且那样的代码也并无实际意义
真有需要时,就把 $i + $i++ 写作 2 * $i++ 也就是了 好像搞清楚了,PHP计算表达式中,同一个变量如果出现过多次,它的值由第二个参与计算的变量决定

$i = 3;$a = $i + ($i + ($i+$i++));echo $i,'#',$a;//4#15,a=4+(4+(4+3))

$i = 3;$a = $i + $i + ($i+$i++);echo $i,'#',$a;//4#14,a=3+3+(4+4))

引用 5 楼 happypiggy2010 的回复:这样的话,会导致因为版本问题而造成不必要的错误。唉...那倒也不是,既然php5的各个版本都是这样,也就无关紧要了。况且那样的代码也并无实际意义
真有需要时,就把 $i + $i++ 写作 2 * $i++ 也就是了

$i = 3;$a = $i + $i++ + ($i+ ++$i);echo $i,'#',$a;//5#17,a=4+3+(5+5))

太高深,大牛!

太高深,大牛!

我来搅一下局,嘿嘿

$i=3;$a = ++$i - ($i + $i++); echo $a, ',', $i;//-5,5$i=3;$a = $i++ - (++$i + $i); echo $a, ',', $i;//-7,5$i=3;$a = ++$i - ($i + ++$i);echo $a, ',', $i; // -6,5

按照PHP就变成

3+4+5了~ Java中是3+3+5,PHP中是4+3+5

引用 1 楼 baoying34 的回复:按照PHP就变成

3+4+5了~


不是诶。我试了一下
  $i=3;
  $j=3;
  $k=3;
  $i=$i + $i++ + ++$i;
  $j=$j++  + ++$j + $j;
  $k=++$k + $k++ + $k;
  echo $i;
  echo $j;…… Java中是3+3+5,PHP中是4+3+5

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn