2

PHPのインクリメント/デクリメント演算子の優先順位と結合性の原則に従っていないように見えるため、誰かがこのコードに頭を包むのを手伝ってくれませんか : /php.net/manual/en/language.operators.increment.php )

1番目の例 -

$a = [ 0, 1, 2 ];
$i = 0;
$a[$i++] = $i;

var_dump( $a );

/* 出力は次のとおりです。

array (size=3)
  0 => int 1
  1 => int 1
  2 => int 2

そして、ここに何が起こっているのかについての私の解釈があります:

1. Array index gets calculated, so $a[$i++] is $a[0]
2. Then rval gets calculated (which after $i++ in the step above) is now 1
3. The value of the expression gets calculated which is  1.

ここまでは順調ですね。*/

2番目の例 -

$a = [ 0, 1, 2 ];
$i = 0;
$a[$i] = $i++;

var_dump( $a );

/* 出力は次のとおりです。

array (size=3)
  0 => int 0
  1 => int 0
  2 => int 2

そして、ここに何が起こっているのかについての私の解釈があります:

1. The array index gets calculated which should be 0 ($a[0]), but ACTUALLY it is 1 ($a[1])
2. The rval gets calculated , which is $i++ , so the value now is 0.
3. The expression value gets calculated , which should be 1 after $i++ in the step above,   but ACTUALLY it is 0.

基本的に、上記の 2 番目の例の手順 1 と 3 を理解できません。*/

4

2 に答える 2

2

コードと同じコメントから:

割り当てインデックス式と値式はどちらも、実際の割り当てが発生する前に評価されます。つまり、post incr/decr をどこに配置しても、意図した結果が得られない可能性があります。

行では、割り当てが行われる前に、左側$a[$i++] = $i;のインデックス式と右側の値式の両方が評価されています。$i++$i

于 2012-12-29T03:29:05.490 に答える
1

これは、代入演算子の優先順位ほど、インクリメントの優先順位と関係がありません。代入式の左辺が最初に評価されます。

上記の最初のケースでは、これはa[0]割り当てられる場所として を選択し、 をインクリメントしてから、現在$iの の割り当てを実行します。$i1

于 2012-12-29T03:31:05.013 に答える