JAVA　基本文法[2] - 計算の文

###### 計算の文
計算の文とは、変数や値を用いた様々な計算処理をコンピュータに行わせるための文。
「四則演算」や「変数に値を代入」するのが計算である。
```Main.java
//例
public class Main {
  public static void main(String[] args) {
    int a; //ここは変数宣言の文
    int b; //ここは変数宣言の文
    a = 20; //「計算の文」（代入）
    b = a + 5; //「計算の文」（足し算して代入）
    System.out.println(a);
    System.out.println(b);
  }
}
/*実行結果
20
25
*/
```

「b = a + 5」のようなものを「式」という。

###### 式の構成要素
まず、式はどのような要素があるのか確認してみよう。
例えば「b = a + 5」を分解すると→変数の「a」「b」や値の「５」、計算記号の「=」「+」に分けることができる。

変数（例.a,b）と値（例.5）を「オペランド」
計算記号（例.=,+）を「演算子」
どんな「式」にも「オペランド」と「演算子」の２つの要素のみで構成されている。

###### オペランド
●リテラル
オペランドの中でも数値「４」や文字列「Hello World」などソースコードで表現される具体的な値を「リテラル」という。そして「それぞれのリテラルはデータ型を持っている」
|        リテラルの種類        | 　   表記例 　   |    型    |
|:-------------------------:|:------------:|:--------:|
|  小数点がない数字            |     30       |int|
|  小数点がない数字で末尾がL又はl|   300000L    |long|
|  小数点付きの数字            |     30.5     |double|
|  小数点付きの数字で末尾がF又はf|   30.5F      |float|
|  true又はfalse             |     true     |boolean|
|  引用符で囲まれた文字         |     '雅'     |char|
|  二重引用符で囲まれた文字      |   "Java"    |String|

※「１」（int型）、「'1'」（char型）、「"1"」（String型）は、どれも別物。

●リテラル以外のオペランド
「変数」、「定数」、「命令の実行結果」

##### エスケープシーケンス
String型やchar型のリテラルを記述する際に、時々用いられるのが「エスケープシーケンス」と呼ばれる特殊文字。
「¥」記号とそれに続く1文字の合計2文字による記述方法で、その2文字で特殊な1文字を表現する。

|  表記  |  格納するデータ  |
|:-----:|:------------|
| ¥" |二重引用符記号（"）|
| ¥' |引用符記号（’）|
| ¥¥ |円記号（¥）|
| ¥n |改行（制御文字）|



###### どのような順番で式が計算されていくか
javaが式に従って計算処理をすることを、式の「評価」と呼ぶ。
３つの原則に従いながら、式の一部から少しずつ部分的に処理していき、最後に式全体の計算処理が完了する。
①評価結果への置換の原則
演算子は周囲のオペランドの情報を使って計算を行い、それらオペランドを巻き込んで結果に化ける(置き換わる)。段階的に評価される。
②優先順位の原則
()内の式は、評価順位を上げれる。
式に演算子が複数ある場合、JAVAで定められた優先順位の高い演算子から順に評価される。
※詳細は演算子にて…
③結合規則の原則
式の中に同じ優先順位グループに属する演算子が複数ある場合、「演算子ごとに決められた方向（⇄）から順に」評価される。
例）＝演算子は右のものから評価される。 a=b=10の場合、b=10が先に評価され、次にa=10が評価されaに10が代入される。
※詳細は演算子にて…


##### 演算子
主に４分類（算術演算子、文字列結合演算子、代入演算子、インクリメント/デクリメント演算子）に分けられる。

●算術演算子
|演算子|     機能     | 　   優先順位 　   |評価の方向|評価の例|
|:-:|:--------------:|:------------:|:--------:|:--------:|
| + |加算（足し算）|中（５）|左→右|3+5→8|
| - |減算（引き算）|中（５）|左→右|10-3→7|
| * |乗算（掛け算）|高（4）|左→右|3*2→6|
| / |除算（割り算）※整数演算では商|高（4）|左→右|3.2/2→1.6、　9/2→4|
| % |剰余（割り算の余り）|高（4）|左→右|9%2→1|

●文字列結合演算子
|演算子|     機能     | 　   優先順位 　   |評価の方向|評価の例|
|:-:|:--------------:|:------------:|:--------:|:--------:|
| + |文字列の連結|中（５）|左→右|"こん"+"にちは"→"こんにちは"、"ベスト"+3→ベスト３ |

●代入演算子
右オペランドの内容を左オペランドの変数に代入する演算子。
代入は基本的に最後に行うものと覚えておこう。
|演算子|     機能     | 　   優先順位 　   |評価の方向|評価の例|
|:-:|:--------------:|:------------:|:--------:|:--------:|
| = |右辺を左辺に代入|最低（15）|右→左|a=10→a<br>(中身は10)|
| += |左辺と右辺を加算して<br>左辺に代入|最低（15）|右→左|a+=2→a<br>(a=a+2と同じ)|
| -= |左辺から右辺を減算し<br>左辺に代入|最低（15）|右→左|a-=2→a<br>(a=a-2と同じ)|
| *= |左辺と右辺を乗算し<br>左辺に代入|最低（15）|右→左|a*=2→a<br>(a=a*2と同じ)|
| /= |左辺と右辺を除算し<br>左辺に代入|最低（15）|右→左|a/=2→a<br>(a=a/2と同じ)|
| %= |左辺と右辺を除算し<br>その余りを左辺に代入|最低（15）|右→左|a%=2→a<br>(a=a%2と同じ)|
| += |左辺の後に<br>右辺を連結して代入|最低（15）|右→左|a+="風"→a<br>(a=a+"風"と同じ)|


●インクリメント/デクリメント演算子
1増やしたい/減らしたい場合に使用する便利な記述。
左右両方にはオペランドを持たない特徴を持つ。単項演算子と総称される。
|演算子|     機能     | 　   優先順位 　   |評価の方向|評価の例|
|:-:|:--------------:|:------------:|:--------:|:--------:|
| ++ |値を１増やす|最高（1）|左→右|a++→a<br>(a=a+1やa+=1と同じ)|
| -- |値を１減らす|最高（1）|左→右|a--→a<br>(a=a-1やa-=1と同じ)|


##### 型変換（３種類）
変数の型を別の型に変換することを型変換という。
●代入時の自動型変換
ある型で宣言された変数には、その型の値しか代入できません。
int型変数にはint型の整数だけ、String型の変数には文字列のみしか代入できないというのが原則。
int = age;
◯ age = 23;
× age = 3.2;
× age = "秘密";
しかし！！！！数値型にて…

::: note info
「小さな型」の値を「大きな型」の変数に代入する場合に限って、「値が自動的に箱の型に変換されて代入」される。
:::
```Main.java
//例
public class Main {
  public static void main(String[] args) {
    float f = 3; //float型の変数にint型を代入
    double d = f; //double型の変数にfloat型を代入
    System.out.println(f);
    System.out.println(d);
  }
}
/*実行結果
3.0
3.0
*/
```
●強制的な型変換
※「大きな型」の値を「小さな型」の変数に代入することは原則できない。
しかし、「キャスト演算子」を用いることで強制的に行型変換することができる。
情報の欠損が発生する為、よほどの理由がない限り使わないこと。

::: note info
(変換先の型名)式
:::
```Main.java
//例
public class Main {
  public static void main(String[] args) {
    int age = (int)3.2; //キャスト演算子
    System.out.println(age);
  }
}
/*実行結果
3
*/
```

●演算時の自動型変換
※前提として計算が行われる場合も「左右のオペランドは同一の型」が原則。
異なる型で演算を行なった場合…「大きな型に統一されてから演算」が行われる。

```Main.java
//例
public class Main {
  public static void main(String[] args) {
    double d = 8.5 / 2;
    long l = 5 + 2L;
    System.out.println(d);
    System.out.println(l);
  }
}/*実行結果
4.25
7
*/
```
因みに、文字列（String）を含む演算時の型変換は、他方もString型に変換され連結する。
```Main.java
//例
public class Main {
  public static void main(String[] args) {
    String msg = "私の年齢は" + 23;
    System.out.println(msg);
  }
}
/*実行結果
私の年齢は23
*/
```