プログラミングにおける式と文とは
混同しやすくて見落とされがちな式と文の違い。
いまさらながら、「式とは何か?」,「文とは何か?」について調べてみた。
式とは
- 式 (プログラミング) - Wikipedia
式(しき、expression)とは、プログラミングにおいて、言語によって定められた優先順位や結びつきの規定に則って評価される値、変数、演算子、関数の組み合わせである。数学における式と同様、式は評価された値を持つ。
文とは
- 文 (プログラミング) - Wikipedia
プログラムにおける文(ぶん、statement)とは、コンピュータプログラミング言語によるプログラムを構成するもののひとつで、一般に手続きを表すものである。
文の種類(意味)は、だいたいの類似はあるが、詳細はそれぞれのプログラミング言語によって異なる。
う~ん、表現がなんとも難しい。
- 式(Expression)と文(Statement) - よねKENのプログラミング研究
式(Expression)と文(Statement) VBで例を挙げると、文には代入文、If文、For文、While文、呼び出し文などがあり、式には条件式(比較式)、呼び出し式、加減算式、定数式などがあります。 文はそれ単独で完結する言語要素です。式はそれ単独では基本的に完結せず、文または式の一部として使用される言語要素です。また、式の最大の特徴として、値を返すという点が挙げられます(文は値を返しません)。
...
VBでは代入は文ですが、C#では代入は式です。
式は文の構成要素。 例えば、if文の中の判定条件は式。
文と式の最大の違いは、値を返すのが式で、返さないのが文。
そうすると、代入文が値を返す言語の場合には、代入文は文であってかつ式でもあるという事に...
C言語の場合は、
C言語では式にセミコロンを付けると文になるのか。
そうすると、改行を区切りとする言語では式に改行があると文になってしまうのかな?
更にそうすると、式でもあり文でもあると解釈できるものもあるという事なのかな。
文には単文と複文(ブロック)がある。
関数定義やクラス定義はその定義全体が1つの複文になるという事かな。
rubyとpythonにおける式と文は。
- Rubyist Magazine - 式と文、評価と実行、そして副作用 ―― プログラムはいかにして動くのか【前編】
Python と Ruby の本質的な違いは、「式と文の区別があること」
Pythonの場合には値を返さない文と値を返す式が存在して、Rubyの場合には、文であっても値を返すので、すべての文は式でもあるという事かな、多分。
言語の違いによっては同じ機能が、文であったり,式であったりしてややこしい。
値を返す関数の呼び出しが式で、値を返さない関数(Pascalのprocedure
- 手続き)の呼び出しが式?
でも、Pythonの場合は値を返さない関数(retun文の無い関数)はNone
が返るからこれは式?
ま、あんまり厳密に考える必要は無いのかも。
追記
Rubyist Magazineの「式と文、評価と実行、そして副作用 ―― プログラムはいかにして動くのか」の後編の内容が気になったので、
- 「式と文、評価と実行、そして副作用」の記事の続き
手続き型言語の単位は「文」
文は一文一文ごとに「実行」される。実行の結果は「副作用」によってのみ表現できる
副作用とは「世界を汚すこと」。手続き型言語は副作用の連続でプログラムが進行していく
汚せる範囲を「スコープ」と呼ぶ
関数型言語の単位は「式」
式は「評価」され、「値」(戻り値)を返す
「式」の評価結果は本来「戻り値」のみであるが、関数型言語の種類によっては副作用を起こすこともできる(関数型言語でも戻り値を無視して手続き型言語のように副作用の連続でプログラムを書くこともできる)
いっぽう副作用を起こさず式の戻り値のみでプログラムを書く純粋関数型言語というものもある
別に純粋関数型言語がエライと言いたいわけじゃないけど、「その処理が世界を汚していないか」を意識してプログラムを書くことはとても大事
ちなみに Python では評価 (eval) と実行 (exec) で分かれていて、eval は戻り値を返すけど execは戻り値を返さないといった感じで式と文が明確に分かれている
Ruby からプログラミングを入門した人は式と文についてあまり意識していないかもしれないとふと思ったので、こういう記事を書いたのであった
違うプログラミング言語もやってみると色々と気づきがあって楽しいですよ