変数,すなわち,インデクス式の値によって選択される配列中の変数とする。配列アクセス式は次の手順を用いて評価される。最初に,その配列参照式が評価される。この評価が中途完了するならば,その配列アクセスは同じ理由で中途完了し,そのインデクス式は評価されない。なければ,そのインデクス式が評価される。この評価が中途完了するならば,その配列アクセスは同じ理由で中途完了する。なければ,その配列参照式の値は配列を参照する。みなされないことに注意すること。配列アクセスでは,その角括弧の左の式は,角括弧の中の式のどの部分よりも前に完全に評価される。式(a=b)[3]よりも前に完全に評価される。元の値が取得及び記憶されていることを意味する。番目の要素の値によってインデクスされる。};System.out.println(a[(a=b)[3]]);}}次のように表示する。等価であるからである。その角括弧の左の式の評価が中途完了するならば,その角括弧の中の式のどの部分も評価されない。Exception("Ciao");}}次のように表示する。埋込み代入は決して起こらないからである。その配列参照式のすべての部分が評価され,これらの評価が正常完了したあとに限る。}}次のように表示する。埋込み代入は,空ポインタの検査の前に起こるからである。skidoo!");}}常に次のように表示する。skidoo!NullPointerExceptionは決して起きない。検査を含むそのインデクス操作が起こる前に,そのインデクス式が完全に評価されるからである。後置演算子の使用を含む。15.8で議論したように,名前を一次式とは考えずに,文法におけるあいまいさを避けるために区別して扱う。それらは,ここに限れば後置式の優先順位のレベルで交換可能になる。演算子があとに続いた後置式は後置増分式とする。その後置式の結果は数値型の変数でなければならない。なければコンパイル時エラーが発生する。その後置増分式の型は,その変数の型とする。後置増分式の結果は,変数ではなく,値とする。実行時に,もしそのオペランド式の評価が中途完了するならば,その後置増分式も同じ理由で中途完了し,増分は起こらない。変数の値に加えられ,その合計がその変数に記憶される。その変数の値に実行される。必要ならば,その合計は,記憶される前にその変数の型へのプリミティブ型の縮小変換(5.1.3)によって縮小される。その後置増分式の値は,その新しい値が記憶される前の変数の値とする。上記の二項数値昇格は,数値集合変換(5.1.8)を含むかもしれないことに注意すること。必要ならば,数値集合変換は,その加算に対して,それが変数に記憶される前に適用される。宣言された変数を加算することはできない。変数のアクセスが式として使用されたとき,その結果は値であり,変数ではないからである。したがって,それを後置増分演算子のオペランドとして使用することはできない。演算子があとに続いた後置式は後置減分式とする。その後置式の結果は数値型の変数でなければならない。なければコンパイル時エラーが発生する。その後置減分式の型は,その変数の型とする。後置減分式の結果は,変数ではなく値とする。実行時に,もしオペランド式の評価が中途完了するならば,その後置減分式も同じ理由で中途完了し,減分は起こらない。変数の値から減じられ,その差分がその変数に記憶される。その変数の値に実行される。必要ならば,その差分は,その新しい値が記憶される前に,その変数の型へのプリミティブ型の縮小変換(5.1.3)によって縮小される。後置減分式の値は,新しい値が記憶される前の変数の値とする。上記の二項数値昇格は,数値集合変換(5.1.8)を含むかもしれないことに注意すること。必要ならば,数値集合変換は,その差分に対して,それが変数に記憶される前に適用される。宣言された変数を減算することはできない。変数のアクセスが式として使用されたとき,その結果は値であり,変数ではないからである。したがって,それを後置減分演算子のオペランドとして使用することはできない。キャスト演算子を含む。単項演算子をもつ式は,右から左へグループ化される。UnaryExpressionCastExpression15.16の次の生成規則を,便宜上ここで繰り返す。演算子が先行した単項式は前置増分式とする。その単項式の結果は数値型の変数でなければならない。なければ,コンパイル時エラーが発生する。その前置増分式の型は,その変数の型とする。その前置増分式の結果は,変数ではなく値とする。実行時に,もしそのオペランド式の評価が中途完了するならば,前置増分式は同じ理由で中途完了し,加算は起こらない。その変数の値に加えられ,その合計はその変数に記憶される。その変数の値に実行される。必要ならば,その合計は,記憶される前に,その変数の型へのプリミティブ型の縮小変換(5.1.3)によって縮小される。その前置増分式の値は,その新しい値が記憶された後の変数の値とする。上記の二項数値昇格は,数値集合変換(5.1.8)を含むかもしれないことに注意すること。必要ならば,数値集合変換は,その加算に対して,それが変数に記憶される前に適用される。宣言された変数を加算することはできない。変数へのアクセスが式として使用されたとき,その結果は値であり,変数ではないからである。したがって,それを前置増分演算子のオペランドとして使用することはできない。演算子が先行した単項式は前置減分式とする。その単項式の結果が数値型の変数でなければならない。なければ,コンパイル時エラーが発生する。その前置減分式の型は,その変数の型とする。その前置減分式の結果は,変数ではなく,値とする。実行時に,もしオペランド式の評価が中途完了するならば,前置減分式は同じ理由で中途完了し,減算は起こらない。その変数の値から引かれ,その差分はその変数に記憶される。その変数の値に実行される。必要ならば,その差分は,記憶される前に,その変数の型へのプリミティブ型の縮小変換(5.1.3)によって縮小される。その前置減分式の値は,その新しい値が記憶された後の変数の値とする。上記の二項数値昇格は,値集合変換(5.1.8)を含むかもしれないことに注意すること。必要ならば,数値集合変換は,その減算に対して,それが変数に記憶される前に適用される。宣言された変数を減算することはできない。変数へのアクセスが式として使用されたとき,その結果は値であり,変数ではないからである。したがって,それを前置増分演算子のオペランドとして使用することはできない。演算子式のオペランドの型はプリミティブ数値型でなければならない。なければ,コンパイル時エラーが発生する。単項数値昇格(5.6.1)がそのオペランドに実行される。その単項加算式の型は,そのオペランドの昇格された型とする。そのオペランドの結果が変数だとしても,その単項加算式の結果は変数ではなく値とする。実行時に,その単項加算式の値はそのオペランドの昇格された値とする。演算子式のオペランドの型は,プリミティブ数値型でなければならない。なければ,コンパイル時エラーが発生する。単項数値昇格(5.6.1)が,そのオペランドに実行される。その単項マイナス式の型は,昇格されたオペランドの型とする。単項数値昇格は,数値集合変換(5.1.8)を実行することに注意すること。昇格されたオペランド値がどの数値集合から引き出されても,単項否定演算が実行され,及びその結果が同じ数値集合から引き出される。その単項否定演算が実行され,及びその結果がそれと同じ数値集合から引き出される。したがって,その結果は,さらに数値集合変換がおこなわれる。実行時に,その単項マイナス式の値は,そのオペランドの昇格した値の算術的否定とする。整数値において,否定はゼロからの減算と同じとする。Javaプログラム言語は,整数において2の補数表現を使用する。否定は最大の負の数となる。この場合はオーバフローが起こるが,例外は投げられない。浮動小数点値において,否定はゼロからの引き算と同じでない。単項マイナスは,単に浮動小数点の符号を逆にする。重要な場合を以下に示す。そのオペランドがNaNならば,その結果はNaN(NaNは符号を持たない)とする。そのオペランドが無限大ならば,その結果は反対の符号の無限大とする。そのオペランドがゼロならば,その結果は反対の符号のゼロとする。式のオペランドの型は,プリミティブの整数的な型でなければならない。なければ,コンパイル時エラーが発生する。単項数値昇格(5.6.1)は,そのオペランドに対して実行される。単項のビット単位の補数式の型は,そのオペランドの昇格された型とする。実行時に,単項のビット単位の補数式の値は,そのオペランドの昇格された値のビット単位の補数となる。等しいことに注意すること。なければ,コンパイル時エラーが発生する。