プログラミングにおける式とは
プログラミングにおける「式」(expression)とは、特定の
プログラミング言語で定められた規則に従って評価される、値、変数、演算子、関数などの組み合わせのことです。数学における式と同様に、式は評価されると値を持ちます。しかし、
プログラミング言語によっては、式が評価される際に副作用を伴うこともあり、常に同じ入力に対して同じ結果を返すとは限らない場合があります。
式と文の違い
多くの手続き型
プログラミング言語では、「式」と「文」が明確に区別されています。文は、プログラムの実行単位であり、
プロシージャは複数の文から構成されます。式は、文の一部として現れることが多く、特に「式文」と呼ばれる文は、式を評価する役割を持ちます。式と文は、セミコロンなどの記号や改行によって区切られることが一般的です。
しかし、一部の言語では、文を特殊な記号で囲むことで式として扱える場合もありますが、これは少数派です。例えば、GCCでは独自拡張としてこのような機能がサポートされています。
式と文が明確に区別されない言語も存在します。
部分を持たない式
変数や
リテラル(数値や文字列など)は、それ以上分解できない基本的な要素であり、内部に他の式を含むことはありません。ただし、配列の
リテラルなど、内部に式を含む場合もあります。
手続呼出
プロシージャ(関数やメソッド)を呼び出す式は、数学における関数の記法と似た構文で記述されることが多いです。
f(x, y)
この構文は、関数型言語だけでなく、多くの
プログラミング言語で採用されています。
演算子式
演算子と項から構成される式を「演算子式」と呼びます。
二項演算子
二項演算子は、2つの項の間に置かれる演算子です。例えば、加算や減算などの算術演算子がこれに該当します。
式1 演算子 式2
プログラミング言語が扱う
データ型が増えるにつれて、演算子と
データ型の関係は複雑化しました。言語によっては、代入も代入演算子による式として扱われる場合があります。
二項演算子を使用する際に注意すべき点として、「演算子の結合性」と「
演算子の優先順位」があります。例えば、算術演算では、乗除が加減よりも優先されるという規則がありますが、プログラミングでは、ビット演算など、他の種類の演算子も考慮する必要があります。
演算子の優先順位が言語によって異なる場合もあり、プログラミングのバグの原因となることもあります。
C言語の例として、ビット
演算子の優先順位が論理演算子よりも低いという設計ミスが挙げられます。これは、C言語初期には論理演算子がなかったことによるものです。
単項演算子
単項演算子は、1つの項に対して作用する演算子です。
前置演算子
前置演算子は、項の前に置かれる演算子です。例えば、負の数を表すためのマイナス演算子などがあります。
前置演算子を多く含む言語もあります。C言語では、様々な前置演算子が用意されています。
後置演算子
後置演算子は、項の後に置かれる演算子です。C言語では、インクリメント演算子(++)やデクリメント演算子(--)、構造体やオブジェクトの要素を選択する演算子などが後置演算子として扱われます。
x++
expression.name
三項演算子は、3つの項に対して作用する演算子です。条件分岐を簡潔に記述するために使用されることが多いです。C言語やJavaScriptなど多くの言語で `条件 ? 式1 : 式2` の形式で使用されます。
代入
代入は、変数に値を割り当てる操作です。代入を文として扱う言語もあれば、代入演算子による式として扱う言語もあります。
例えばC#では代入は式であり、式の結果として代入された値が得られますが、同じ.NET系の言語であるVB.NETでは代入は文であり、値を持ちません。
代入が式である場合、複数の代入を連結して記述することができます。
z = y = x;
上記の例では、まず `y = x` が評価され、xの値がyに代入され、この式の値は代入された値になります。次に、`z = (y=xの結果)` が評価され、`y = x` の結果の値がzに代入されます。そして、最後に式全体の結果の値は破棄されて文として実行されます。
一方、代入が文である場合は、以下のような挙動となります。
z = y = x
この例では、`y=x` が等価演算子として扱われる場合、この式の結果は真偽値(True or False)となります。そして、その値がzに代入されます。しかし、代入が文であるため、この文全体の値はありません。
このように、代入が式か文かで処理の結果が異なる場合があるため、注意が必要です。