[PHP-users 35356] Re: 演算子の評価順位

jun kuwamura kuwamura.jun @ gmail.com
2010年 8月 27日 (金) 15:52:05 JST


-
% php -v
PHP 5.2.14 (cli) (built: Jul 27 2010 06:20:40)
...
% php -r '$a = 1; echo ($a + $a-- + 0 ) . ", $a" ."\n";'
1, 0
% php -r '$a = 1; echo ($a + $a++ + 0 ) . ", $a" ."\n";'
3, 2

% php -r '$a = 1; echo ($a + 0 + $a--) . ", $a" ."\n";'
2, 0
% php -r '$a = 1; echo ($a + 0 + $a++) . ", $a" ."\n";'
2, 2
--

"$a + $a-- + 0" のときは、$a-- が先に評価されていますが、
"$a + 0 + $a--" のときは、 "$a + 0 + $a" まで処理されてから
$a-- が評価されているような結果と見えます。 ++ 演算子に
ついても同じですね。
ちょっと矛盾を感じますね。


-- 演算子は結合しないで、+ 演算子よりも優先されるとすると、
 $a=1; echo ($a + 0 + $a--) ;
は、
 echo (1 + 0 + 0);
となるべきと思います。

# あれ、perlも同じ結果になるなあ。。。



2010/8/26 Shindo <shindo @ atsystem.jp>:
> 進藤です。
>
> http://www.php.net/manual/ja/language.operators.precedence.php
>  + - . の結合時の評価は left
>  ++ --  の結合時の評価は 結合しない
>
> http://www.php.net/manual/ja/language.operators.increment.php
>  $a--   後置減算子   $a を返し、$a から 1 を引きます。
>
> これらをベースに考えると
> $a = 1;
> echo ($a + $a-- + 0)
>
> 1)最初に左の$aが評価されて、次に+演算が
>   (1 + $a-- +0)
> 2)次に右側の$aが評価されて、その後、$aはデクリメントされ
>   (1 + 1 + 0)
> 3)式の評価として次の+演算が評価され
>   2
> が素直かなと
>
> ただ、文法上は式の評価が
>  ($a + ($a-- + 0)) と見なすことも可能ですから
>  (1 + 0) で $a が0になり
>  (0 + (1 + 0))
>  1
> もアリですね。
>
> ただ、互換性を考えるとPHP4の評価順がPHP5でも再現されて欲しいかなと
>
>
>>野村です。
>>$aと$a--が評価される順番の問題ですね。
>>--$aではないので$a--の評価結果が0にはならないはずです。
>>ただし、$aが$a--より後に評価されるのであるのなら、0となり得ます。
>>A + B の評価がB A A+Bの順で行われるのなら、前者が2、後者が1となり得ますね。
>>ただ、そうでないのであれば、前者と後者の値は両方とも2になるはずです。
>>文法上、規定はなく実装上の問題と思われます。
>
>
> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>  進藤寿則@アットシステム   _/_/
>  e-mail shindo@atsystem.jp     _/
>  Phone 022-385-1593 Fax 385-1595  _/
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>



-- 
 Jun Kuwamura
rC Cn
  ^
  ~


PHP-users メーリングリストの案内