【Java】計算式の評価の仕組み(評価結果への置換、優先順位、結合規則)について

計算処理のイメージJava入門
サバ缶
サバ缶

どうもこんにちは!
サバ缶(@tech_begin)です。

こちらの記事で、Javaにおける計算式の方法について解説してきました。

今回は、その計算式の中でJavaがどのような順序で計算を行なっているのかを解説していきます。
Javaのことを知ることで、効率的かつ正確なプログラミングを行うことができますよ!

「式の評価」とは

Javaの式にはオペランドとリテラルがありました。
式に従って計算をすることを「評価:evaluation」と呼びます。

どのプログラミング言語でも『評価』を行うことで、計算の優先順位を決めています。

計算式の評価の原則

計算式には変わりようがない「原則」があります。
その原則には、3つあります。

  • 評価結果への置換の原則
  • 優先順位の原則
  • 結合規則の原則

これらを以下で詳しく見ていきます。

評価結果への置換の原則

言葉だけ聞くとちょっと難しそうですが、一つずつ順番に見て行けば簡単です。
例えば以下のような式があったとしましょう(一旦Javaの文法に則って変数に代入しています)

int a = 1 + 1;

+演算子は、オペランド(ここでは1というデータ)を加算する性質を持っています。
それと同時に、結果を「置換する」という動作もします。

int a = 1 + 1;

// 以下に置換されて実行される
int a = 2;

これを『評価結果への置換の原則』と呼びます。
これは私たち人間も頭の中で計算するときに行うことなので、馴染みもあって理解しやすいかと思います。

重要

演算子は周囲のオペランドの情報を使って計算を行い、それらオペランドを巻き込んで結果に置き換わる(置換される)。

優先順位の原則

次は、1つの式に複数の演算子があった場合、どのように計算をするか判断する原則についてです。

Javaにおける計算では、15段階の優先順位があります。
かと言って、別に全て覚える必要はありません。
一般的な計算方法と同じなので、身構えなくて大丈夫です!

基本的に以下のような法則を覚えておけば大丈夫です。

  • 第三優先 → +と-
  • 第二優先 → *と/と%
  • 第一優先 → ()
/* 例その1 */
int a = 10 + 20 * 3;
// *(掛け算)の方が優先度が高いので、以下のようになる
int a = 10 + 60;
// 置換の原則によって、以下のようになる
int a = 70;

/* 例その2 */
int b = (10 + 20) * 3;
// ()で囲まれた計算が最優先されるので、以下のようになる
int b = 30 * 3;
// 置換の原則によって、以下のようになる
int b = 90;

これらの計算の順番は、小学生のころ算数で学んだものと同じですね。

重要

式に演算子が複数ある場合は、Javaで定められた優先順位の高い演算子から順に評価される。
基本的には、算数と同じ計算の順序で問題ない。

結合規則の原則

置換、優先順位があることがわかりました。
もし仮に同じ優先順位のものが並んだ場合は、どのような順番で計算するのでしょうか。

演算子には必ず「左から評価する」「右から評価する」という計算の順番の方向が決まっています。

基本的には四則計算の演算子(+, -, *, /, %)は『左から右』へ。
代入する演算子(=)は『右から左』へ。

/* 例その1 */
int a = 10 + 20 + 30;
// +は左から計算するので、以下のようになる
int a = 30 + 30;
// 以下のように置換される
int a = 60;

/* 例その2 */
int a = b = 100;
// =演算子は右から左へ計算していくため、以下のようになる
int a = 100;

これらの優先順位や計算の方向は、暗記で覚えようとする必要はありません。
コードを書けば書くほど自然と定着していくので、まずは多くのコードを書いていきましょう!

重要

式の中に同じ優先順位グループに属する演算子が複数ある場合、演算子ごとに決められた方向から順に評価される。

まとめ

基本的に小学生の頃に学んだ算数とほとんど同じですね。

解説文を読めば、基本的な部分は理解できるかと思います。

しかし、どうしても書かれている意味がわからない、ちょっと相談したいという方は、お気軽にTwitterなどにてご連絡くださいませ。

タイトルとURLをコピーしました