next up previous contents
Next: 7. 関数 Up: 6. 制御式 Previous: 6.14 throw式

6.15 制御式の制限事項

制御式も「式」なので、演算に利用することができます。しかし、制御式を演 算に利用する場合は、

という制限があります。これは、構文解析のあいまいさをなくすための制限で す。

例として、制御式に対する配列インデックス演算について見てみます。まず、 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]) ;

これは、カッコとカッコの間に、複数の式があることになるためです。


next up previous contents
Next: 7. 関数 Up: 6. 制御式 Previous: 6.14 throw式
Tetsuo Ono
1998-11-05