せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Java】「式」と「文」と「式文」と。 パーフェクトJava学習感想文 その5

パーフェクトJavaを読んで改めてJavaを振り返り中。

眠い。

経緯については学習記録その1をご参照ください。

以下、学んだこと。

 

文・式とは

 

文とは(特徴)

  • 単独で完結する言語要素

 

文の種類

制御文
ブロック文
宣言文
式文(空文を含む)

このうち終端にセミコロンを要求するのは
「宣言文」と「式文」だけ。


 

式とは(特徴)

  • 演算子と式を演算子の規則に従い並べたもの
  • 文or式の一部として使用される言語要素
  • リテラル値も識別子も、単独で書くと式
  • オペランドに取れるものは式だけ
  • 値を返す

 

式の存在できる箇所

式の中のオペランド
文の中の構成要素(例えばif-else文の条件式)
式文

 
識別子も単独で書くと「式」。
だから、

Human taro = new Human();
Human tmp = taro;

 
の2つ目の式は、

=演算子において左オペランドがtmpという式、右オペランドがtaro という式。
代入演算子は左辺のオペランドを先に評価する。
変数を左辺値として評価すると、値の代入先としての場所を返す。
右辺を評価して得た評価値を、その場所に代入する動作となる。

オペランドとなるか、右オペランドとなるかで評価結果が変わってくる。
非可換。
可換な演算子もある。+演算子(加算演算子)は可換。

演算子(代入演算子)を使った式は、
変数の値を変えているので副作用のある式と言える。


 

演算子とは

オペランドの数や位置、オペランドに取れる型、が決まっている。

例えばnewも演算子
new式 とは、 new演算子の右オペランドにクラス名をおいたもの

Hoge h = new Hoge();

は、代入演算子の右オペランドがnew式。

  

メソッド呼び出し演算

メソッド呼び出しの()も演算子
オペランドがメソッド名(識別子であり「式」)、右オペランドが引数式。


 

文・式を分解すると

 

式文(ExpressionStatement)

式の一部は終端にセミコロンをつけることで文になる。
これを式文という。
 

式文の種類

式文に出来る式は以下の種類がある

代入式
前置、後置のインクリメント・デクリメント式(i++など)
メソッド呼び出し式
new演算子を使ったオブジェクト生成式

 
だから、

int a = 10;
a;
a + 100;

の2行目、3行目はエラーになる。
2行目は単独で識別子を書いているので「式」だけれど、
式文にできる式ではない。
よってエラー。
3行目も「式」だけど式文にできる式ではない。

a = b + c;

がエラーにならないのは
式文(代入式)の中に式(加算式)が存在しており、
つまり、式の存在できる箇所に式が存在しているから。


 
おやすみなさい。