アカウント名:
パスワード:
C++で演算子オーバーロードで operator^ をベキ乗演算にすると、「a^2」でaの2乗が計算出来るぞー、と喜んでいたら、「a^2+1」と書いてハマった、
ってのをやったことがあります。#C/C++では、^より+が上なので、「a^(2+1)」と解釈される…
> # 1 << 2 + 1とか。算術演算とビット演算を混ぜると罠にはまります。(1 << 2) の bit0 が 0であることは自明ですが、そうではない場合わかりにくいバグの原因になりかねないという問題もあります。1 << 2 | 1 と書きましょう。
1 << (2 + 1)を意図して書きたい状況ってどんなの?元コメントは(1 << 2) + 1のつもりで1 << 2 + 1と書いてしまうと言ってるんじゃないの?だから1 << 2 | 1と書けば括弧はいらないよ、というつもりで書いたんだけど?
シフト数を変数によって制御するなんていくらでもありそう。(「+ 1」の部分が変数になる)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
d=a+(b*c) (スコア:0)
レビューの度に複数の演算子を使うときは必ず括弧を使えといわれ、ウザいことこの上なかった。
あれから幾年月、アレ以上の人には出会ってはいない。
Re:d=a+(b*c) (スコア:1)
# 1 << 2 + 1とか。
1を聞いて0を知れ!
Re:d=a+(b*c) (スコア:1)
C++で演算子オーバーロードで operator^ をベキ乗演算にすると、
「a^2」でaの2乗が計算出来るぞー、と喜んでいたら、
「a^2+1」と書いてハマった、
ってのをやったことがあります。
#C/C++では、^より+が上なので、「a^(2+1)」と解釈される…
Re: (スコア:0)
> # 1 << 2 + 1とか。
算術演算とビット演算を混ぜると罠にはまります。
(1 << 2) の bit0 が 0であることは自明ですが、そうではない場合わかりにくいバグの原因になりかねないという問題もあります。
1 << 2 | 1 と書きましょう。
Re:d=a+(b*c) (スコア:1, 興味深い)
1 << 2 | 1 は (1 << 2) | 1 なので 5
罠にはまったね
Re: (スコア:0)
1 << (2 + 1)を意図して書きたい状況ってどんなの?
元コメントは(1 << 2) + 1のつもりで1 << 2 + 1と書いてしまうと言ってるんじゃないの?
だから1 << 2 | 1と書けば括弧はいらないよ、というつもりで書いたんだけど?
Re:d=a+(b*c) (スコア:1)
シフト数を変数によって制御するなんていくらでもありそう。(「+ 1」の部分が変数になる)
Re: (スコア:0)
> 1 << (2 + 1)を意図して書きたい状況ってどんなの?
『オフセット + オフセットからのビット位置』とか。
元の例だと生の定数を書いてるから想像しにくいかもしれないけど、演算子の組み合わせとしては普通にあり得ると思う。
>だから1 << 2 | 1とかけば括弧はいらないよ
皮肉にも、誤解を招かないためには括弧を書いた方が良いという好例になってしまいましたね。