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

jun kuwamura kuwamura.jun @ gmail.com
2010年 8月 27日 (金) 17:06:49 JST


くわむらです


2010/8/27 Mori Yojiro <yojiro-m @ boobytrap.ne.jp>:
> On Wed, 25 Aug 2010 18:43:20 +0900
> Shindo <shindo @ atsystem.jp> wrote:
>
>> $ php -r '$a = 1; echo ($a + 0 + $a--) . "\n";'
>> 2
>> $ php -r '$a = 1; echo ($a + $a-- + 0) . "\n";'
>> 1
> 演算子の優先順位が同じ場合の評価順序って定義されていましたっけ?
> C言語の場合で関数の引数の評価順序は処理系依存だったように思いましたので。
> a=1; func(++a, ++a);

やはり処理系依存の問題なのですか。
さっき、メールを送ってからはたと気がついたのですが、

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

--$a ではなく $a-- は後評価なので上記ではなく、
進藤さんの書かれてた、

> 1)最初に左の$aが評価されて、次に+演算が
>   (1 + $a-- +0)
> 2)次に右側の$aが評価されて、その後、$aはデクリメントされ
>   (1 + 1 + 0)
> 3)式の評価として次の+演算が評価され
>   2
> が素直かなと

のほうが矛盾がないとも思いました。
gccの処理ではそうなりました。

--
% cat >test.c<<EOF
#include "stdio.h"
main (){
int a, b;
a = 1; b = (a + a-- + 0); printf ("%d, %d\n",b, a);
}
EOF
% cc test.c
% ./a.out
2, 0

% perl -e '$a = 1; $b = ($a + $a-- + 0); print  "$b, $a" ."\n";'
1, 0

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

いずれにしろ、どちらかに統一されていないと
うっかり使えないですね。
(python, ruby では --a のような前置の演算子
だけで、a-- のようなのはかったと思います。)


-- 
 Jun Kuwamura
rC Cn
  ^
  ~


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