アカウント名:
パスワード:
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」の部分が変数になる)
まったくわかってないのは問題だけど、かっこつけたところで遅くなるわけではないから付けとけばいいんだよ。自分より馬鹿なやつが保守するときのためにね。
べつに、分かりやすくて読みやすければかっこつける必要ないだろ。"かっこうをつける"メリットが感じられない。
その先輩LISP使いだったんじゃないの?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日本発のオープンソースソフトウェアは42件 -- ある官僚
d=a+(b*c) (スコア:0)
レビューの度に複数の演算子を使うときは必ず括弧を使えといわれ、ウザいことこの上なかった。
あれから幾年月、アレ以上の人には出会ってはいない。
Re:d=a+(b*c) (スコア:2)
バグを防ぐのにも有用だし、たいていの場合は読みやすくもなるだろうし。
上に四則演算以外ならと言ってる人がいますが、私の場合除算でも括弧付けるな。
a=1のときa+2÷5は?って言われると間違いなく1.4と答えるけど、
a+2/5だと\frac{a+2}{5}と思って0.6と答えてしまうかも知れない。
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とかけば括弧はいらないよ
皮肉にも、誤解を招かないためには括弧を書いた方が良いという好例になってしまいましたね。
Re:d=a+(b*c) (スコア:1)
優先順位がなく単純に端から解釈する処理系は珍しくありません。(酷いのになると優先順位不定とか未定義…)
後々の事を考慮すれば、括弧で明示しておいた方が面倒がないです。
「専用言語Xで記述していた処理を別言語Yに移植する」ケースを考えてください。 どのような表記が面倒が少ないかは自明だと思います。
notice : I ignore an anonymous contribution.
Re: (スコア:0)
まったくわかってないのは問題だけど、かっこつけたところで遅くなるわけではないから付けとけばいいんだよ。
自分より馬鹿なやつが保守するときのためにね。
かっこつけてかっこかかない (スコア:0)
べつに、分かりやすくて読みやすければかっこつける必要ないだろ。
"かっこうをつける"メリットが感じられない。
Re: (スコア:0)
この文も、どの修飾語がどの単語にかかるか分かりにくいです。
Re: (スコア:0)
その先輩LISP使いだったんじゃないの?
Re: (スコア:0)
実際の優先順位は調べれば直ぐに分かることだし、例え自分が記憶していたとしても、記憶に頼るよりも括弧を付けるようにしておく方が誰が見ても間違いない。
記憶しておいて役に立つのは、 (ネットにも繋げず、資料も無いような) 簡単に調べることが出来ない環境でコーディング・デバッグをするときくらいじゃないかな。
自分でコードを書くときだって、演算子の優先順位でバグを出さないことに毎回注意するよりは、括弧を常に付けるようにしておく方が楽でしょ。
# 昔 if (x & 0x01 == 0) { /* ... */ } なんてやってハマった事もある AC。
Re: (スコア:0)
ある程度、理屈上の区切りには括弧つけるようになったよ俺も