てきとう

てきとう

演算子の優先順位

今更綺麗にひっかかったけど、Erlang演算子の優先順位が他と違う。
例えばPython

>>> 1 << 2 & 4
4

あるいはRuby

irb(main):001:0> 1<<2 & 4
=> 4

またはC、

% cat op.c
#include <stdio.h>

int main(){
  printf("%d\n",1<<2&4);
}
% gcc op.c
% ./a.out
4

これらの(メジャーと思われる)言語では、&の結合度が<<より低いため、

(1<<2) & 4

4 & 4

4

と解釈される。
それに対してErlangでは、band、andはビットシフトより優先されるので、

1> 1 bsl 2 band 4.
1

つまり、

1 bsl (2 band 4)

1 bsl 0

1

と解釈されているらしい。


他にも、

>>> True or False == False
True

のようなPythonの式を、Erlangで同じように書くと、

> true or false == false.
false

結果が違う。
これも、論理演算子(※andalsoとorelseは除く)の結合度が比較演算子のそれより高く、

(true or false) == false

true == false

false

と解釈されるために起こるようだ。


結局のところ「括弧で範囲を明示するのは(特にErlangでは)大事」という話なんだけど、Erlangの他からの乖離は面白い。
何か深い意味があるんだろうか・・・