演算子
演算子とは、値のチェック・変更・結合に使用する記号または記号のグループです。 日常的に使用されている演算子も多くあります。 例えば、1 + 2
という式は加算演算子 (プラス記号) を使用し、2つの数値を足し合わせて、3という結果を返します。 = や > などの比較演算子は、2つ以上の値を比較するためのものです。
4Dランゲージでサポートされている演算子は、C や JavaScript など他の言語でも使用されています。 ただし、等号比較演算子 (=
) との誤用を防ぐため、代入演算子は :=
となっています。 算術演算子 (+、-、*、/、%...) や、 比較演算子 (=、>、>=...) などの 基本演算子 は、 数値のほか、ブール、テキスト、日付、時間、ポインター、ピクチャーのデータ型にも使用可能です。 JavaScript と同様に、4Dランゲージも truthy (真的) と falsy (偽的) の概念をサポートしており、短絡演算子 で使用されています。
用語
4Dランゲージでは、二項演算子 および 三項演算子 をサポートしています:
- 二項演算子とは、2つの対象に対して演算をおこない、その 2つの対象の間に表示されます (例:
2+3
)。 - 三項演算子は 3つの対象に対して演算をおこないます。 C と同様、4D の三項演算子は 1つしかありません: 三項条件演算子 (a ? b : c`).
演算子が影響を与える対象はオペランド (被演算子) と呼ばれます。 1 + 2
という式では、+ 記号は二項演算子であり、その 2つのオペランドは値 1 と 2 です。
代入
代入演算子 (a:=b
) は、a
の値を b
の値で初期化、または更新します。
$myNumber:=3 // MyNumber 変数に 3 を代入し ます
$myDate:=!2018/01/21! // 日付リテラルを代入します
$myLength:=Length("Acme") // コマンドの結果 (4) を $myLength に代入します
$col:=New collection // $col を空のコレクションで初期化します
代入演算子
:=
と等号比較演算子=
とを混同しないように注意してください。=
とは異なる代入演算子が採用されたのは意図的なことで、他のプログラミング言語で == や === の使用によって度々起こる間違いを避けるためです。 このような間違いはコンパイラーにとっても発見しにくく、時間を消耗するトラブルシューティングのもとです。
基本演算子
演算の結果は、オペランドの データ型 に依存します。4D はスカラーデータ型に対して様々な演算子をサポートしています。 詳細は、各データ型の項にて説明されています:
- 論理演算子 (ブール 式に使用)
- 日付演算子
- 時間演算子
- 数値演算子
- ビットワイズ演算子 (倍長整数 式に使用)
- ピクチャー演算子
- ポインター演算子
- 文字列演算子
- オブジェクト参照演算子
- コレクション参照演算子
- Null 演算子
- 未定義演算子
複合代入演算子
履歴
リリース | 内容 |
---|---|
19 R4 | 追加 |
4Dでは、代入と演算を組み合わせた 複合代入演算子 をサポートしています。 その一例として、加算代入演算子 (+=
) があります。
$a:=1
$a+=2 // $a=3
次の複合代入演算子がサポートされています:
演算子 | シンタックス | 代入される型 | 例題 |
---|---|---|---|
加算 (足し算) | Text += Text | テキスト | $t+=" World" //$t:=$t+" World" |
Number += Number | Number | $n+=5 //$n:=$n+5 | |
Date += Number | 日付 | $d+=5 //$d:=$d+5 | |
Time += Time | 時間 | $t1+=$t2 //$t1:=$t1+$t2 | |
Time += Number | Number | $t1+=5 //$t1:=$t1+5 | |
Picture += Picture | ピクチャー | $p1+=$p2 //$p1:=$p1+$p2 ($p1 の右に $p2 を追加します) | |
Picture += Number | ピクチャー | $p1+=5 //$p1:=$p1+5 ($p1 を 5ピクセル右に移動します) | |
減算 (引き算) | Number -= Number | Number | $n-=5 //$n:=$n-5 |
Date -= Number | 日付 | $d-=5 //$d:=$d-5 | |
Time -= Time | 時間 | $t1-=$t2 //$t1:=$t1-$t2 | |
Time -= Number | Number | $t1-=5 //$t1:=$t1-5 | |
Picture -= Number | ピクチャー | $p1-=5 //$p1:=$p1-5 ($p1 を 5ピクセル左に移動します) | |
除算 (割り算) | Number /= Number | Number | $n/=5 //$n:=$n/5 |
Time /= Time | 時間 | $t1/=$t2 //$t1:=$t1/$t2 | |
Time /= Number | Number | $t1/=5 //$t1:=$t1/5 | |
Picture /= Picture | ピクチャー | $p1/=$p2 //$p1:=$p1/$p2 ($p1 の下に $p2 を追加します) | |
Picture /= Number | ピクチャー | $p1/=5 //$p1:=$p1/5 ($p1 を 5ピクセル垂直に移動します) | |
乗算 (かけ算) | Text *= Number | テキスト | $t*="abc" //$t:=$t*"abc" |
Number *= Number | Number | $n*=5 //$n:=$n*5 | |
Time *= Time | 時間 | $t1*=$t2 //$t1:=$t1*$t2 | |
Time *= Number | Number | $t1*=5 //$t1:=$t1*5 | |
Picture *= Number | ピクチャー | $p1*=5 //$p1:=$p1*5 ($p1 を 5倍にリサイズします) |
これらの演算子は、あらゆる 代入可能な式 に適用できます (オブジェクトのプロパティやコレクション要素としてのピクチャーを除く)。
"代入先 複合代入演算子 値" と "代入先 := 代入先 演算子 値" は、厳密には等価ではありません。なぜなら、前者の場合、代入先 (変数・フィールド・オブジェクトプロパティ・コレクション要素) は一度しか評価されないからです。 たとえば、getPointer()-+=1
のような式では、getPointer
メソッドは一度だけ呼び出されます。
テキストの文字インデックス および BLOB のバイトインデックス では、これらの演算子はサポートされません。
例題
// Addition
$x:=2
$x+=5 //$x=7
$t:="Hello"
$t+=" World" //$t="Hello World"
$d:=!2000-11-10!
$d+=10 //$d=!2000-11-20!
// Subtraction
$x1:=10
$x1-=5 //$x1=5
$d1:=!2000-11-10!
$d1-=10 // $d1=!2000-10-31!
// Division
$x3:=10
$x3/=2 // $x3=5
// Multiplication
$x2:=10
$x2*=5 // $x2=50
$t2:="Hello"
$t2*=2 // $t2="HelloHello"
短絡演算子
演算子 && と || は、短絡演算子です。 短絡演算子とは、必ずしもすべてのオペランドを評価しない演算子のことです。
& や | 論理演算子 と異なる点は、短絡演算子の && と || はブール値を返さないことです。 これらは式を truthy (真的) または falsy (偽的) で評価し、どちらかの式を返します。
AND 短絡演算子 (&&)
履歴
リリース | 内容 |
---|---|
19 R4 | 追加 |
ルールは以下の通りです。
Expr1 && Expr2
において:
AND 短絡演算子はオペランドを左から右へ評価し、falsy と評価された最初のオペランドの値を直ちに返します。すべての値が truthy であれば、最後のオペランドの値が返されます。
次の表は、&& 演算子の様々なケースをまとめたものです:
Expr1 | Expr2 | 返される値 |
---|---|---|
truthy | truthy | Expr2 |
truthy | falsy | Expr2 |
falsy | truthy | Expr1 |
falsy | falsy | Expr1 |
例題 1
var $v : Variant
$v:= "Hello" && "World" //"World"
$v:=False && 0 // False
$v:=0 && False // False
$v:=5 && !00-00-00! // 00/00/00
$v := 5 && 10 && "hello" //"hello"
例題 2
オンラインストアで、税率が適用される商品とされない商品があるとします。
税金を計算するには、価格に税率をかけますが、税率は指定されていない場合があります。
そこで、次のように書くことができます:
var $tax : Variant
$tax:=$item.taxRate && ($item.price*$item.taxRate)
taxRate が NULL (または未定義) の場合、$tax
は NULL となり、それ以外の場合には計算結果が格納されます。
例題 3
短絡演算子は、次のようなテストに有効です:
If(($myObject#Null) && ($myObject.value>10))
// コード
End if
もし $myObject が Null であれば、第2引数は実行されないため、エラーは発生しません。
OR 短絡演算子 (||)
履歴
リリース | 内容 |
---|---|
19 R4 | 追加 |
|| 演算子は、指定されたオペランドのうち 1つの値を返します。 式は左から右に評価され、以下のルールに基づいて "短絡" 評価の可能性をテストされます。
Expr1 || Expr2
において:
Expr1 が truthy であれば、Expr2 は評価されず、計算は Expr1 を返します。
Expr1 が falsy の場合、計算は Expr2 を返します。
次の表は、|| 演算子の様々なケースと返される値をまとめたものです:
Expr1 | Expr2 | 返される値 |
---|---|---|
truthy | truthy | Expr1 |
truthy | falsy | Expr1 |
falsy | truthy | Expr2 |
falsy | falsy | Expr2 |
例題 1
Employee というテーブルがあるとします。 従業員には電話番号を入力している人と入力していない人がいます。 つまり、$emp.phone
は NULL である可能性があり、テキスト変数に NULL を代入することはできません。 そこで、次のように書くことができます:
var $phone : Text
$phone:=$emp.phone || "n/a"
この場合、$phone
には電話番号か 、"n/a" という文字列のどちらかが格納されます。
例題 2
name フィールドと、既婚女性のための maiden name (旧姓) フィールドを持つ Person テーブルがあるとします。
次の例は、旧姓データがあれば変数に格納し、なければその人の名前を変数に格納します。
var $name: Text
$name:=$person.maidenName || $person.name