naoppy-jyokenの日記

Javaで競プロをするぞ、NITAC情研用

Java入門7

リテラル

リテラルとは、ソースコード中に埋め込んで意味を成すもののことです。

"abcd"123453.14trueなどがそうです。

文字列リテラル、整数リテラル、少数リテラルなどリテラルの種類で言い分けたりもします。

sjc-p.obx21.com

このリンクには、様々なリテラルが紹介されているので目を通してください。

逆にリテラルでないものとは、変数名、クラス名、関数名、などです。

例えばint a = 10;というコードがあったとして、aという変数名は別にbなどに変えても(使っている場所を全て変更すれば)ソースコードの意味は変わりません。 ソースコード中に埋め込まれたデータではないのでリテラルではありません。 しかし、10という数字は、これが11や20になるとソースコードの意味が全く異なります。これはデータなのでリテラルです。

基本型の変数に代入できるもの

基本型の変数に代入できるものは何でしょうか? 前の記事では型名 変数名 = 値と書きました。 しかしそれでは下のコードが動く説明ができません。

int a = 10;
int b = a + 20;

「a+20」は値ではないですよね?

正解を言うと、右辺にくるのは値ではなく、評価されてその型の値になる式です。

式とは、演算子オペランドと式を演算子の規則に従い並べたものです。 こう書くと難しく感じるかもしれませんが、例えば1 + 13 * xなどです。

式は式の一部になります

新しく出てきた用語達はこれから説明します。

演算子

演算子とは、Javaで決められている計算などを定義する記号のことで、それなりの種類があります。 全て覚える必要はありません。

java-code.jp

このリンクに種類についてよくまとまっています。

演算子はその演算子によりますが、1~3個のオペランドと呼ばれる計算対象をとります。 例えば、+演算子a + bのように、左と右にオペランドを取ります。 他には、=演算子で、a = bのように使い、aにbを代入します。 インクリメント演算子a++のように、1つしかオペランドをとらない演算子もあります。

演算子も式の構成要素です。

演算子には優先順位結合規則があります。 このコードを実行してみてください。 何が表示されるでしょうか。

class Codechef
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int a = 10 + 5 * 3;
        int b = 5 * 3 + 10;
        System.out.println(a);
        System.out.println(b);
    }
}

この結果から、どの順番で書いたかに関わらず、加算より乗算が先に実行されることがわかります。 全ての演算子について、この優先順位が決まっています。 例えば、乗算*と加算+では乗算の方が優先順位が上です。

加算+と減算-では、同じ優先順位です。同じ優先順位の時は結合規則を考えます。 加算、減算は左結合の演算子なので、左から計算されます。

演算子オペランドと共に評価されるときの順番も、結合規則を考えます。 a + b+が左結合なので先にaを計算してからbを計算して、a+bの値を返します。

ちなみにですが、括弧で括ることにより、優先順位が一番高くなるので、複雑な式を書く場合は括弧を使って計算順序をわかりやすくするべきです。

評価

評価とは、誤解を恐れずに言えば計算することです。 今までの文の計算する、の部分は全部評価と言い換えて大丈夫です。 このようなコードがあり、今からJVMが下の行のコードを評価するとします。

int x = 10;
int y = (5 * 3) + x / 5;

まず、括弧内が一番優先順位が高いので、5*3が評価され、15という値を得ます。 この時点ではint y = 15 + x / 5;となっています。 次に、/演算子の優先順位が高いので、x / 5を実行します。 xは評価されて10になり、10 / 5で2という値を得ます。 そして次に優先順位が高い+を含む式を評価するので15 + 2が計算され、17という値が求まりました。 あとはint y = 17を評価すれば終わりです。こうしてyに17が代入されました。

すごく長かったですが、お疲れ様でした!

まとめ