2013年5月5日日曜日

C言語の優先順位

久しぶりにC言語でプログラムを書いていたら,結合子の優先順位でハマってしまいました.
ビット演算(&とか|)は比較演算(==とか)より優先度が低いんですね.
つまり,
(x>>i)&y != 0

(x>>i) & (y != 0)
と解釈されてしまうんですね.
大抵の場合,これは考えている順番とは違うのでは?
他の算術演算(+とか)やシフト演算では,比較演算より優先度が高いですし.

StackOverflowでちょうど同じ質問があり,答えとしては,
  • 慣れろ
  • KernighanやDennis Ritchieに聞くしかない
  • 短絡評価のない論理演算の代わりに使う場合 
など.3番目の理由は
if (x == 1 & y == 0) {
    /* ... */
}
のような場合,この優先度でないとうまく行かないと補足説明があります.
Dennis Ritchie
 
実際,Dennis Ritchieの説明では,
  • 元々C言語には&&や||は無かった
  • &&や||が必要な場面では"truth-value context"で代用
  • ifなど論理値が必要とされる所では,ビット演算では無く&&や||となる仕組み
  • &&と||が追加され,ビット演算の&,|と短絡評価の&&,||が分離 される
  • Dennisは優先度の問題について気づいたが,すでに既存のコードがありすぎた…
みたいな流れだった模様.
これもバッドノウハウの一つでしょうか?

0 件のコメント:

コメントを投稿