制御式も「式」なので、演算に利用することができます。しかし、制御式を演 算に利用する場合は、
という制限があります。これは、構文解析のあいまいさをなくすための制限で す。
例として、制御式に対する配列インデックス演算について見てみます。まず、 if式をブロック式で囲んでいる場合です。
x = { if (y % 2 == 0) [10,20,30] else [1,2,3] }[1] ;
このプログラムを実行すると、x の値は、
y が偶数のときは、[10,20,30]
y が奇数のときは、[1,2,3]
となります。
これは、上記のプログラムが以下の2つの式で構成されていることを意味しま す。
a) x = { if (y % 2 == 0) [10,20,30] else [1,2,3] }
b) [1]
a)は代入式で、その右辺はブロック式となります。さらに、それに続いて b) の `[1]'という配列定数を表す式があるものと解釈されます。
次に、前のプログラムのブロック式を単なるif式に直した下記のプログ ラムを見てみます。
x = if (y % 2 == 0) [10,20,30] else [1,2,3] [1] ;
このプログラムを実行すると、x の値は、
y が偶数のときは、[10,20,30]
y が奇数のときは、2
となります。この場合は、最後の[1]は、else部の配列定数 [1,2,3] に 対する配列インデックスと解釈することになります。
ブロック式の計算結果に対して、配列インデックスを取りたい場合は、ブロッ ク式全体を、カッコでくくって、次のように書きます。
x = ({ if (y % 2 == 0) [10,20,30] else [1,2,3] })[1] ;
このプログラムを実行すると、ブロック式の演算結果に対して、配列インデッ クス演算を行なうことになり、x の値は、
y が偶数のときは、20
y が奇数のときは、2
となります。
また、以下のプログラムは、エラーとなります。
x = ({ if (y % 2 == 0) [10,20,30] else [1,2,3] }[1]) ;
これは、カッコとカッコの間に、複数の式があることになるためです。