プログラミングで間違えやすい、植木算の計算方法を解説
Aru
Aru's テクログ(Aruaru0)
いくつかの言語の演算子の優先順をまとめてみました。言語により差異があるので、移植の際には注意しないと思わぬバグが発生することがあります。なるべく()
をつけて明示的に優先順を設定しておいた方がよいです。
この記事では、C/C++, Go, Python, Javaの演算子の優先順を一覧にしてみました。優先順を確認するのに利用できるかと思います。
「どの言語も優先順なんて同じでは?」と思っている方もいると思います。実際、自分もそう思っています。
ただ、一部の演算の優先順は異なります。
例えば%と>>の優先順位がC++とGo言語では異なります。C++の場合は、x>>i % 2
は、x >> (i % 2)
と解釈されますが、Go言語では(x >> i) % 2
と解釈されます。つまり、両者の計算結果が異なるということです。
このようなことがあるので、優先順には注意し、迷う場合は()
をつける癖をつけておいた方が良いかとおもます。
ちなみに、「Cパズルブック」からの抜粋ですが、結果はわかりますか?
int x, y, z;
x = -3 * 4 % -6 / 5;
x = 2;
x *= 3 + 2;
x *= y = z = 4;
演算子順はパズルブックのパズル問題になるレベルです
C/C++言語の演算子の優先順です
優先順位 | 結合規則 | |
高 | [ ] ( ) . -> | 左から右 |
sizeof & * + - ~ ! ++ -- (前置) | 右から左 | |
* / % | 左から右 | |
+ - | 左から右 | |
<< >> | 左から右 | |
< > <= >= | 左から右 | |
& | 左から右 | |
^ | 左から右 | |
| | 左から右 | |
&& | 左から右 | |
|| | 左から右 | |
? : | 右から左 | |
低 | = *= /= %= | 右から左 |
Go言語の演算子の優先順です。かなりシンプルです。
優先順位 | |
高 | *, /, %, <<, >>, &, &^ |
+, -, |, ^ | |
==, !=, <, >, <=, >= | |
&& | |
低 | || |
Python言語の演算子の優先順です
優先順位 | |
高 | ** |
+x, -x, ~x | |
*, @, /, //, % | |
+, - | |
<<, >> | |
& | |
^ | |
| | |
in, not in, is, is not, <, <=, >, >=, !=, == | |
not x | |
and | |
or | |
if -- else | |
低 | lambda |
Java言語の演算子の優先順です
優先順位 | 結合規則 | |
高 | (引数) [配列添字] . ++ --(後置き) | 左から右 |
! ~ + -(単項演算子) ++ --(前置き) | 右から左 | |
new (型変換) | 左から右 | |
* / % | 左から右 | |
+ - | 左から右 | |
<< >> >>>> | 左から右 | |
> >= < <= instanceof | 左から右 | |
== != | ||
& | 左から右 | |
^ | 左から右 | |
| | 左から右 | |
&& | 左から右 | |
|| | 左から右 | |
? : | 右から左 | |
低 | = *= /= %= | 右から左 |