2016年9月23日金曜日

C言語(C++)の演算子の優先順位の話

トラブったのでメモ
 
C++でVector3という3次元ベクトルのクラスを作り演算子「+」をベクトルの足し算に、「*」をベクトルの内積に、「^」をベクトルの外積としてオーバーロードしました。そして以下のように実行しました。
 =======code start=======
Vector3 a, b, c;
float s;
//a, b, sへの値の代入
c=a*s+a^b;
=======code end=========
 このときもちろん c=(a*s)+(a^b) と実行することを期待していたのですが実際は c=((a*s)+a)^b と実行されました。

C言語の演算子の優先順位

演算子の優先順位はCもC++の一緒です。ここに良くまとまっているので、見やすいです。大まかに示すと
優先度高
・添え字系
・単項演算子系
・積算系
・加算系
・シフト
・条件演算子
・ビット演算子
・論理演算子
優先度低
となっています。
演算子はオーバーロードしても演算子の優先順位は変わりません。今回使った3つの演算子の優先順位は 積算(*) > 加算(+) > ビット反転(^) だったのに割り当てた機能を元に 内積(*) = 外積(^) > 加算(+) と勘違いしたことが原因でした。
これに懲りて外積は剰余(%)に割り当てることにします。

0 件のコメント:

コメントを投稿