演算時の優先順位がない処理系
昔、C言語で開発をしていたころに、処理系によって演算の優先順位があてにならないから、すべてカッコを使えと言われたことがあります。
なんだよそれ、と当時思いましたが、数十年ぶりに臆面もなくそう書いてある処理系のマニュアルを目にしました。
次の引用は、Cache SQLというSQLのリファレンスマニュアルからです。
算術演算子の優先順位がSQL-92 標準とは異なる
Caché SQLには演算子の優先順位はなく、算術式は必ず左から右の順番で解析されます。この規則は、Caché ObjectScriptでも同様です。そのため、「3+3×5=30」という式は、カッコを使って「3+(3×5)=18」としなければなりません。
演算子の優先順位が全くないというこれまた割り切った仕様です。割り算掛け算の優先もないとは恐れ入ります。こういう処理系で開発はしたくないなと思いました(してるけど)。
しかし、Wikipediaを見ると、Smalltalkなんかも演算子の優先順位が全くない処理系だったようです。使った事はないけれど、歴史についての記述で名前はよく目にした言語です。
また、演算によっては演算の優先がない方が括弧を使わずに書けて簡潔という例も書かれていました。
Wikipediaには、さらに次のような話も書かれていました。
単項演算子としてのマイナス記号(負号)の扱い方はいくつかある。普通に書いた場合、−32 は −(32) = −9 を意味するが[3]、数式を扱うアプリケーションやプログラミング言語(特に Microsoft Office Excel やプログラミング言語bc)では単項演算子を二項演算子より優先しているためマイナス記号は冪乗より優先順位が高く、−32 は (−3)2 = 9 と解釈される[4]。意図した結び付きにならない場合は括弧を使って明示しなければならないし、優先順位をあてにせずに常に括弧を付けるという防御の姿勢をとることもある。
単項演算子を使う際には気を付けねばと思いました。
ついでに、関数電卓だと 1 + 2 * 3 みたいな計算が、そのまま入力しても計算できることも知りました(普通の電卓だと 2 * 3 + 1 とする必要がある)。関数が使えるだけじゃなかったんだ!
コメント
コメントを投稿