IDLでは大半の演算子(operator)はオペランド(operand; 被演算子)が配列であっても使用できる。たとえば、[1,2,3] * [4,5,6]
の結果は[4,10,18]
となり、[1,2,3] + 2
の結果は[3,4,5]
となる。
https://www.nv5geospatialsoftware.com/docs/operator_precedence.html を参照。
優先順位が同じ演算子同士の場合、左から右に評価される(左結合)。
&&
と ||
の優先順位は同じで、左から評価される。1 || 1 && 0
の結果は 0
になる。AND
, OR
, XOR
の優先順位は同じで、左から評価される。1 OR 1 AND 0
の結果は 0
になる。NOT
の優先順位は、加減算と同じで、乗除算よりは低く、比較演算子よりは高い。NOT 1b / 2b
の結果は 127
ではなく 255
になる。2 ^ 1 ^ 2
は左から評価され 4
となる。1 eq 2 eq 0
は左から評価され 1
(真) となる+ - * /
(二項演算子)+
は文字列の連結にも用いられる。 -
は負の符号を示す単項演算子としても用いられる)^
(二項演算子)3^2.5
MOD
(二項演算子)7 mod 2
++ --
(単項演算子)++
でオペランドの値を1増やし、--
でオペランドの値を1減らす。式の評価値を用いるときは、前置のほうが後置よりも高速でメモリ消費量も少ない(後置の場合、データのコピーが行われて、元のデータの値を変更してから、コピーしたデータが評価値として用いられる)。副作用と評価順序にも注意(例えば A = B++ + B
などとしてはいけない)。>
(二項演算子)a
が配列の時、b = a > 0
とするとa
の要素のうち正のものはそのまま、負のものは0になってb
に格納される。<
(二項演算子)右オペランドの表記に負の符号が含まれる場合には括弧で囲む必要がある 例: 5 < (-6)
。最大・最小演算子と-は優先順位が同じであるため。
複素数の場合は絶対値で比較される。2つのオペランドの絶対値が等しいときは、最初のオペランドが返される。
オペランドがNaNである場合の結果は未定義(最大演算子のときは右オペランドの値、最小演算子の時は左オペランドの値を返す?)。この場合は、( FINITE(A) && FINITE(B) ) ? ( A > B ) : !VALUES.F_NAN
などとする。
IDL では、比較演算子としては LT
, GT
などを用いる。もし、IF a > b THEN ...
としても文法的には正しいが、おそらくそれは意図した結果ではない (aとbのうち大きい方の値が真偽値として評価される)。
#
(二項演算子)A # B
は行列の積 BA を計算する。1つめの配列の列と2つめの配列の行との間でそれぞれ内積が計算される。1つめの配列の行数と2つめの配列の列数は等しくなければならない。ただし、2つめの配列が1次元配列で、転置することでつじつまが合う場合は、かけあわせる前に転置してくれる。結果の配列のサイズは、列数は1つめの配列と、行数は2つめの配列と等しくなる。A # B
はmatrix_multiply(A,B)
と等価。##
(二項演算子)A ## B
は行列の積 AB を計算する。1つめの配列の行と2つめの配列の列との間でそれぞれ内積が計算される。1つめの配列の列数と2つめの配列の行数は等しくなければならない。ただし、1つめの配列が1次元配列で、転置することでつじつまが合う場合は、かけあわせる前に転置してくれる。結果の配列のサイズは、行数は1つめの配列と、列数は2つめの配列と等しくなる。A ## B
はB # A
と等価。IDL 6.0で導入された。論理演算子はオペランドとして配列をとることはできない。配列のときはLOGICAL_OR
, LOGICAL_AND
関数を用いるか、引数が0, 1 のみをとる場合はビット演算子で代用する(これらの場合、両方の引数が評価されることに注意する)。&&
と ||
の優先順位は等しいことにも注意。論理演算子とビット演算子の表現がPerlとは逆であることに注意。
&&
(二項演算子)||
(二項演算子)~
(単項演算子)論理演算子とビット演算子の表現がPerlとは逆であることに注意。AND
, OR
, XOR
の優先順位は等しいことにも注意。ビットシフトにはISHFT関数を用いる。
AND
(二項演算子)NOT
(単項演算子)OR
(二項演算子)XOR
(二項演算子)オペランドがNaNとなっている可能性があるときは、あらかじめFINITE
関数でNaNでないことを確認しておく。
EQ NE GE GT LE LT
(二項演算子)'2' gt '10'
は真となるが 2 gt '10'
は偽となる。? :
(三項演算子)expr1 ? expr2 : expr3
としたとき、expr1
が真なら expr2
が評価され、偽なら expr3
が評価される。左辺値としても使える。(expr1 ? var1 : var2) = expr2
( )
sin(0.5)
(a+3)*5
a(1)
[ ]
a=[1.3,1.5,1.9,2.7]
a[1]
配列の添え字を指定するには、角括弧による a[1]
と 丸括弧による a(1)
の2通りの書き方がある。丸括弧を利用すると関数呼び出しや演算子の評価順序変更と紛らわしいので、角括弧を用いるほうがよい。compile_opt strictarr
で丸括弧による添え字の指定を禁止できる。
=
a = (b = 1)
とするとa, b
ともに1が代入される。括弧なしで a = b = 1
とすると左から結合され、(a = b) = 1
だと解釈され Syntax error となる。+= -= *= /= ^= MOD= <= >= #= ##= AND= OR= XOR= EQ= GE= GT= LE= LT= NE=
a += b
は a = a + (b)
と同様の結果になる。a
の型が演算の前後で変わらないときは、データのコピーは行われないため、正確にはa = temporary(a) + (b)
と等価であり、メモリ消費と計算時間を節約できる。*
.
->
.
と等価)