「演算子の優先順位」の版間の差分

削除された内容 追加された内容
96行目:
[[C言語]]における[[ビット演算]]や[[論理演算]]の優先順位は[[関係演算子|比較演算]]より低い。<code>a == b && c == d</code>のように、比較結果をさらに論理演算することは通常よくあるので妥当な設計と言えるが、ビット演算の優先順位の低さについては問題があり、例えば本来<code>(x & mask) == y</code>と書くべきところを誤って<code>x & mask == y</code>と書いてしまうなど、しばしば言語仕様に関する理解度の低さやケアレスミスによる[[バグ]]の原因となる。C言語の設計者[[デニス・リッチー]]は、この優先順位はC言語黎明期において、[[B言語]]からC言語への変換の苦痛を軽減するために定めたものであると説明しており、また仮に<code>&</code>と<code>==</code>の優先順位が入れ替わっていれば、現在のC言語のイディオムを単純化できていただろうとも述べている<ref>[https://web.archive.org/web/20150219094531/cm.bell-labs.com/who/dmr/chist.html The Development of the C Language - §"Neonatal C"], [[Internet Archive]]</ref>。
 
C言語の影響を直接あるいは間接的に受けた言語のうち、[[C++]]、[[Perl]]、[[PHP (プログラミング言語)|PHP]]、[[Java]]、[[C Sharp|C#]]、[[JavaScript]]などの多くの言語は演算子の優先順位をそのまま踏襲しているが、[[Go (プログラミング言語)|Go]]のように優先順位を修正したものもある。もともとC言語においてビット演算子の優先順位に関するケアレスミスが発生しやすいのは、真偽値型([[ブーリアン型]])がなく、論理演算の結果が[[整数型]](<code>int</code>型)になるためでもあるが、後発のJavaやC#では論理演算の結果がブーリアン型になり、さらにC++と違ってブーリアン型から整数型への暗黙変換([[汎整数拡張]])もなされないため、記述ミスは大抵のケースにおいて型の不一致によるコンパイルエラーが発生することで未然に発見される。なお、C/C++においても、<code>x & mask == y</code>などと書いた場合は、記述ミスの可能性があることを警告してくれる[[コンパイラ]]<ref>例えば[[GNUコンパイラコレクション|GCC]]や[[Clang]]ではコンパイルオプション<code>-Wparentheses</code>の警告付けることでまた[[Microsoft Visual C++]]では C4554 の警告を有効にすることで記述ミスを発見できる。</ref>や[[静的コード解析]]ツール ([[lint]]) もある。
 
Cにおける[[演算子]]の優先順位は次の通りである。