演算子を使用してJava式を評価する

Javaアプリケーションは、リテラル、メソッド呼び出し、変数名、および演算子の組み合わせであるを評価することによってデータを処理します。式を評価すると、通常、新しい値が生成されます。この値は、変数に格納したり、意思決定に使用したりすることができます。

このチュートリアルでは、Javaプログラムの式を作成する方法を学習します。多くの場合、演算子を使用してJava式を記述します。また、使用方法を知るための演算子にはさまざまな種類があります。Javaの演算子タイプ(加法、ビット単位、論理、条件付き、シフト、および等式タイプを含む)とそれらのオペランドを簡単に紹介します。また、演算子のオーバーロードや演算子の優先順位などの重要な概念についても学び、プリミティブ型変換のデモンストレーションを見ることができます。最後に、プリミティブ型変換を自分で練習するために使用できる小さなJavaプログラムで締めくくります。

ダウンロードコードを取得するこのチュートリアルのサンプルアプリケーションのソースコードをダウンロードします。JavaWorld用にJeffFriesenによって作成されました。

簡単な表現

単純な式はリテラル、変数名、またはメソッド呼び出しです。オペレーターは関与しません。簡単な式の例を次に示します。

52 // integer literal age // variable name System.out.println("ABC"); // method call "Java" // string literal 98.6D // double precision floating-point literal 89L // long integer literal

単純な式が有するタイププリミティブ型または参照型のいずれかです。これらの例で52は、は32ビット整数(int);です。 値を返さないため、System.out.println("ABC");void(void)です。 "Java"文字列(String); 98.6D64ビットの倍精度浮動小数点値(double); そして89L64ビット長の整数です(long)。ageの種類はわかりません。

jshellを試す

を使用して、これらの式やその他の簡単な式を簡単に試すことができますjshell。たとえば52jshell>プロンプトで入力すると、次のような出力が表示されます。

$1 ==> 52

$1名前であるスクラッチ変数jshellストアに作成されます52。(リテラルが入力されるたびにスクラッチ変数が作成されSystem.out.println($1)ます。)実行すると52、出力として表示されます。

コマンドライン引数()を指定jshellして実行すると、詳細なフィードバックを生成できます。この場合、入力すると次のメッセージが表示され、スクラッチ変数のタイプが(32ビット整数)であることがわかります。-vjshell -v52$1int

| created scratch variable $1 : int

次に、を入力してみてくださいage。この場合、シンボルが見つからなかったというエラーメッセージが表示される可能性があります。Javaシェルは、それageが変数であると想定していますが、そのタイプを認識していません。タイプを含める必要があります。たとえば、を入力するとどうなるかを確認しますint age

複合式

化合物は、式を介してより大きな表現に統合一つ以上の単純な式から成るオペレータ記号ソースコードで表される一連の命令です。演算子は、式のオペランドを別の値に変換します。例えば、中6 * 5、乗算演算子(*)変換オペランド6530へ。

複合式は、より大きな式に組み合わせることができます。たとえば、6 * 5 + 10は、複合式6 * 5と、それらの積、加算演算子+、および数値で構成される複合式を示します10。評価の順序(最初に乗算してから加算する)は、Javaの優先規則によって決定されます。これについては、後ほど説明します。

複合式も単純にすることができます

6 * 52つの単純な表現で構成される化合物式である、65。しかし、それ6 * 5はまた、+の観点からの単純な表現です。+オペレータは、簡単な式であるだけで自社の製品、30を見ています。

演算子とオペランド

Javaの演算子は、オペランドの数によって分類されます。

  • 単項演算子は、例えば、1つのオペランドを持つ単項マイナス(例えば、-5)。
  • バイナリ演算子は、 2つのオペランドを有し、例は、乗算および加算です。
  • 三項演算子は、 3つのオペランドがあります。例として、条件演算子?:)があります。

Javaの演算子も、位置によって分類されます。

  • 接頭演算子は、そのオペランドを(例えば、先行する単項演算子です-5)。
  • 後置演算子が(例えば、そのオペランドを以下の単項演算子であるage++;-に1を加えるageの数値)。
  • 中置演算子は、オペレータのオペランド(例えば、間のバイナリまたは三項演算子ですage + 5)。

別のjshellの例

次のセクションでは、アプリケーションの形で例を示す、より多くの演算子を紹介します。次のjshellように、でこれらの演算子を試すこともできます。

jshell> 6 + 2 $1 ==> 8 jshell> 7 * $1 $2 ==> 56

この場合、最初に式を入力します6 + 2。この式はjshell、結果の8をスクラッチ変数に割り当てて評価します$1。次に、乗算$1することにより7、そのスクラッチ変数に格納56 $2。この例は、Java式でスクラッチ変数を使用できることを示しています。

オーバーロードされた演算子

プラス(+)演算子は、オーバーロードされた演算子の例です。これは、オペランドのタイプに基づいていくつかの操作の1つを実行する演算子です。plus演算子は、両方のオペランドが整数の場合は整数加算、両方のオペランドが浮動小数点値の場合は浮動小数点加算、両方のオペランドが文字列の場合は文字列連結を実行します。マイナス(-)演算子もオーバーロードされ、整数または浮動小数点の減算を実行します。

Javaの演算子タイプ

加法演算子

添加演算子は加算と減算を介して数値を増加または減少させます。加算演算子には、加算(+)、減算()、ポスト-デクリメント(--)、ポストインクリメント(++)、プレデクリメント(--)、およびプレインクリメント(++)が含まれます。文字列の連結(+)も加算的であると見なされます。これらの各演算子の正式な定義は次のとおりです。

  • さらに:考えると、各オペランドが文字または数値型である必要があり、追加の和を返します。例:。operand1 + operand2operand2operand14 + 6
  • 減算:与えられ、各オペランドは文字または数値型でなければなりません。差から減算して、差を返します。例:。operand1 - operand2operand2operand14 - 6
  • Postdecrement: Given variable--, where variable must be of character or numeric type, subtract 1 from variable's value (storing the result in variable) and return the original value. Example: x--;.
  • Postincrement: Given variable++, where variable must be of character or numeric type, add 1 to variable's value (storing the result in variable) and return the original value. Example: x++;.
  • Predecrement: Given --variable, where variable must be of character or numeric type, subtract 1 from its value, store the result in variable, and return the new decremented value. Example: --x;.
  • Preincrement: Given ++variable, where variable must be of character or numeric type, add 1 to its value, store the result in variable, and return the new incremented value. Example: ++x;.
  • String concatenation: Given operand1 + operand2, where at least one operand is of String type, append operand2's string representation to operand1's string representation and return the result. Example: "A" + "B".

The addition, subtraction, postdecrement, postincrement, predecrement, and preincrement operators can generate values that overflow the limits of the result type. For example, adding two large positive 64-bit integer values can produce a value that cannot be represented in 64 bits. The resulting overflow is not detected or reported by Java's additive operators.

Overflow detection in the Java standard class library

The standard class library's Math class includes methods for detecting overflows. For example, int addExact(int x, int y) adds the values in x and y, returning the sum or throwing an exception on overflow.

Example application: Additive operators

Listing 1 presents a small application for playing with Java's additive operators.

Listing 1. Additive operators in Java (AddOp.java)

class AddOp { public static void main(String[] args) { System.out.println(125 + 463); System.out.println(2.0 - 6.3); int age = 65; System.out.println(age); System.out.println(age--); System.out.println(age++); System.out.println(--age); System.out.println(++age); System.out.println("A" + "B"); } }

You learned in the previous tutorial how to use the JDK's javac tool to compile Java source code and the java tool to run the resulting application. Execute the following command to compile Listing 1:

javac AddOp.java

Assuming successful compilation, you should observe an AddOp.class file in the current directory. Execute the following command to run it:

java AddOp

AddOp responds by producing the following output:

588 -4.3 65 65 64 64 65 AB

Studying this output offers insight into the postincrement, postdecrement, preincrement, and predecrement operators. For postincrement/postdecrement, age's current value is output before the increment/decrement operation. For preincrement/predecrement, the operation is performed and its result is stored in age, and then age's new value is output.

Iterating with Java operators

The additive operators are especially useful in the context of an iteration statement, where they are used to advance to the next iteration. You'll learn about iteration statements in the next Java 101 tutorial.

Array index operator

The array index operator ([]) accesses an array element by providing the element's index (position). This operator is placed after the array variable's name, as in grades[0] (access the first element in the array assigned to grades; the first element is stored at index 0). Here's a formal definition:

Given variable[index], where index must be of integer (int) type, read a value from or store a value into variable's storage element at location index. Example: temperatures[1]

The value passed to index is a 32-bit integer that is either 0 or a positive value ranging to one less than the array's length, which is indicated by appending .length to the name of the array. For example, grades.length returns the number of elements in the array assigned to grades.

Array variables vs arrays

grades is not an array, but is a variable containing a reference to a region of memory that forms the array. This is true for all Java arrays. However, it's conventional to refer to grades or any array variable as an array.

Example application: Array index operator

Listing 2 presents the source code to an example application that lets you play with the array index operator.

Listing 2. Array index operator in Java (ArrayIndexOp.java)

class ArrayIndexOp { public static void main(String[] args) { int[] grades = { 89, 90, 68, 73, 79 }; System.out.println(grades[1]); grades[1] = 91; System.out.println(grades[1]); int index = 4; System.out.println(grades[index]); System.out.println(grades['C' - 'A']); // System.out.println(grades[1D]); } }

Listing 2 is somewhat more interesting than Listing 1. After creating a five-element, one-dimensional array of integers (via an array initializer) and assigning the array's reference to grades, main() proceeds to access various elements. Two items are of special interest:

  • The array index operator's index must ultimately be a 32-bit integer (0 or a positive value). You can specify the name of an integer variable (e.g., index), which contains the index value, as the index.
  • You can specify a calculation involving character literals. (Later in this tutorial I'll introduce type conversions, and you'll discover why 'C' - 'A' produces an integer (2), which serves as a valid index.)

The final example, which passes 1D as an index to the array index operator, is commented out because it will not compile. If you uncomment the line and attempt to compile Listing 2, you will receive an error message about incompatible types: "possible lossy conversion from double to int.."

Compile Listing 2 (javac ArrayIndexOp.java) and run the application (java ArrayIndexOp). You should observe the following output:

90 91 79 68

The array index operator and multidimensional arrays

You can use this operator with multidimensional arrays. For example, assuming a two-dimensional costs array, costs[0][1] accesses the element assigned to the first row (via [0]) and the second column (via [1]).

Assignment operators

The assignment operator (=) assigns an expression's value to a variable (e.g., i = 6;), including an array element (e.g., x[0] = 15;). The expression and variable must be assignment compatible, meaning their types must agree. For example, you cannot assign a string literal to an integer variable. I'll explain more about this when we discuss type conversions.

複合代入演算子は(+=-=*=/=%=&=|=^=<<=>>=>>>=)は、式を評価し、ワンステップでの変数に結果を割り当てます。各式と変数は、割り当てに互換性がある必要があります。各演算子は便利なショートカットとして機能します。たとえば、を指定する代わりにx = x + 3;、より短く同等のを指定できますx += 3;

短くしてください!

x = x + 1;またはを指定する代わりにx = x - 1;、短いx += 1;またはを指定できますx -= 1;。短いまたはを指定することで、さらに多くのキーストロークを節約できます。x++;x--;

ビット演算子