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

削除された内容 追加された内容
指示代名詞の乱用を是正。出典に書かれていない記述を削除。
96行目:
[[C言語]]における[[ビット演算]]や[[論理演算]]の優先順位は比較演算より低い。<code>a == b && c == d</code>のように、比較結果をさらに論理演算することは通常よくあるので妥当な設計と言えるが、ビット演算の優先順位の低さについては問題があり、例えば本来<code>(x & mask) != 0</code>と書くべきところを誤って<code>x & mask != 0</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 != 0</code>などと書いた場合は、記述ミスの可能性があることを警告してくれる[[コンパイラ]]もある。
 
Cにおける[[演算子]]の優先順位は次の通りである。
129行目:
|12 || <nowiki>||</nowiki> || 論理OR
|-
|13 || ?: || [[条件演算子]]
|-
|14 || = &nbsp; += &nbsp; -= &nbsp; *= &nbsp; /= &nbsp; %= &nbsp; &= &nbsp; <nowiki>|=</nowiki> &nbsp; ^= &nbsp; <<= &nbsp; >>= || 代入