メインコンテンツまでスキップ
バージョン: 20

演算子

演算子とは、値のチェック・変更・結合に使用する記号または記号のグループです。 日常的に使用されている演算子も多くあります。 例えば、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 はスカラーデータ型に対して様々な演算子をサポートしています。 詳細は、各データ型の項にて説明されています:

複合代入演算子

履歴
リリース内容
19 R4追加

4Dでは、代入と演算を組み合わせた 複合代入演算子 をサポートしています。 その一例として、加算代入演算子 (+=) があります。

$a:=1 
$a+=2 // $a=3

次の複合代入演算子がサポートされています:

演算子シンタックス代入される型例題
加算 (足し算)Text += TextText$t+=" World" //$t:=$t+" World"
Number += NumberNumber$n+=5 //$n:=$n+5
Date += NumberDate$d+=5 //$d:=$d+5
Time += TimeTime$t1+=$t2 //$t1:=$t1+$t2
Time += NumberNumber$t1+=5 //$t1:=$t1+5
Picture += PicturePicture$p1+=$p2 //$p1:=$p1+$p2 ($p1 の右に $p2 を追加します)
Picture += NumberPicture$p1+=5 //$p1:=$p1+5 ($p1 を 5ピクセル右に移動します)
減算 (引き算)Number -= NumberNumber$n-=5 //$n:=$n-5
Date -= NumberDate$d-=5 //$d:=$d-5
Time -= TimeTime$t1-=$t2 //$t1:=$t1-$t2
Time -= NumberNumber$t1-=5 //$t1:=$t1-5
Picture -= NumberPicture$p1-=5 //$p1:=$p1-5 ($p1 を 5ピクセル左に移動します)
除算 (割り算)Number /= NumberNumber$n/=5 //$n:=$n/5
Time /= TimeTime$t1/=$t2 //$t1:=$t1/$t2
Time /= NumberNumber$t1/=5 //$t1:=$t1/5
Picture /= PicturePicture$p1/=$p2 //$p1:=$p1/$p2 ($p1 の下に $p2 を追加します)
Picture /= NumberPicture$p1/=5 //$p1:=$p1/5 ($p1 を 5ピクセル垂直に移動します)
乗算 (かけ算)Text *= NumberText$t*="abc" //$t:=$t*"abc"
Number *= NumberNumber$n*=5 //$n:=$n*5
Time *= TimeTime$t1*=$t2 //$t1:=$t1*$t2
Time *= NumberNumber$t1*=5 //$t1:=$t1*5
Picture *= NumberPicture$p1*=5 //$p1:=$p1*5 ($p1 を 5倍にリサイズします)

これらの演算子は、あらゆる 代入可能な式 に適用できます (オブジェクトのプロパティやコレクション要素としてのピクチャーを除く)。

"代入先 複合代入演算子 値" と "代入先 := 代入先 演算子 値" は、厳密には等価ではありません。なぜなら、前者の場合、代入先 (変数・フィールド・オブジェクトプロパティ・コレクション要素) は一度しか評価されないからです。 たとえば、getPointer()->+=1 のような式では、getPointer メソッドは一度だけ呼び出されます。

テキストの文字インデックス および BLOB のバイトインデックス では、これらの演算子はサポートされません。

例題

// 加算
$x:=2
$x+=5 //$x=7

$t:="Hello"
$t+=" World" //$t="Hello World"

$d:=!2000-11-10!
$d+=10 //$d=!2000-11-20!

// 減算
$x1:=10
$x1-=5 //$x1=5

$d1:=!2000-11-10!
$d1-=10 // $d1=!2000-10-31!

// 除算
$x3:=10
$x3/=2 // $x3=5


// 乗算
$x2:=10
$x2*=5 // $x2=50

$t2:="Hello"
$t2*=2 // $t2="HelloHello"

短絡演算子

演算子 &&|| は、短絡演算子です。 短絡演算子とは、必ずしもすべてのオペランドを評価しない演算子のことです。

&| 論理演算子 と異なる点は、短絡演算子の &&|| はブール値を返さないことです。 これらは式を truthy (真的) または falsy (偽的) で評価し、どちらかの式を返します。

AND 短絡演算子 (&&)

履歴
リリース内容
19 R4追加

ルールは以下の通りです。

Expr1 && Expr2 において:

AND短絡演算子はオペランドを左から右へ評価し、falsy と評価された最初のオペランドの値を直ちに返します。すべての値が truthy であれば、最後のオペランドの値が返されます。

次の表は、&& 演算子の様々なケースをまとめたものです:

Expr1Expr2返される値
truthytruthyExpr2
truthyfalsyExpr2
falsytruthyExpr1
falsyfalsyExpr1

例題 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 を返します。

次の表は、|| 演算子の様々なケースと返される値をまとめたものです:

Expr1Expr2返される値
truthytruthyExpr1
truthyfalsyExpr1
falsytruthyExpr2
falsyfalsyExpr2

例題 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

優先順位

演算子 &&|| は、論理演算子 & および | と同じ優先順位を持ち、左から右へ評価されます。

つまり、a || b && c は、(a || b) && c として評価されます。

三項演算子

履歴
リリース内容
19 R4追加

三項演算子を使うと、条件式を 1行で書くことができます。 たとえば、If...Else 文を完全に置き換えることができます。

三項演算子は 3つのオペランドを次の順序で受け取ります:

  • 条件とクエスチョンマーク (?)
  • 条件が truthy である場合に実行される式、その後にコロン (:)
  • 条件が falsy の場合に実行される式

シンタックス

シンタックスは次のとおりです:

条件 ? truthy時の式 : falsy時の式

トークンシンタックス にはコロンが使われているため、競合を避けるには、コロン : の後にスペースを入れる、または、トークンは括弧でくくることが推奨されます。

例題

単純な例

var $age : Integer
var $beverage : Text

$age:=26
$beverage:=($age>=20) ? "ビール" : "ジュース"

ALERT($beverage) // "ビール"

テーブルのデータを扱う例

この例では、人のフルネームを変数に格納し、ファーストネームやラストネームが指定されていないケースに対応します:

var $fullname : Text

// どちらか片方の情報が欠けている場合には存在する方を格納し、両方存在しない場合は空の文字列を格納します。
$fullname:=($person.firstname && $person.lastname) ? ($person.firstname+" "+$person.lastname) : ($person.lastname || $person.firstname) || ""

Truthy と Falsy

履歴
リリース内容
19 R4追加

各値はデータ型のほかに、固有のブール値を持ちます。このブール値は truthy (真的) または falsy (偽的) です。

truthy および falsy の値は短絡演算子 および 三項演算子 の場合にのみ評価されます。

以下の値は falsy です:

  • false
  • Null
  • undefined
  • Null オブジェクト
  • Null コレクション
  • Null ポインター
  • Null ピクチャー
  • Null 日付 !00-00-00!
  • "" - 空の文字列
  • [] - 空のコレクション
  • {} - 空のオブジェクト

上記以外の値はすべて truthy と評価されます。次の値も truthy です:

  • 0 - 数値のゼロ (整数かどうかを問わず)

4Dでは、truthyfalsy の評価は値の 使用性 を反映します。つまり、truthy な値は存在し、エラーや予期せぬ結果を発生させずにコードによって処理できることを意味します。 その目的は、オブジェクトやコレクションにおける undefinednull 値を扱うための便利な方法を提供し、実行時エラーを回避するのに必要な If...Else 文の数を少なくすることにあります。

たとえば、OR 短絡演算子 を使用すると:

$value:=$object.value || $defaultValue

$objectvalue プロパティを含まない場合、または同プロパティが null の場合に、デフォルト値が代入されます。 つまり、この演算子は特定の値ではなく、その値の存在や使用性をチェックするのです。 なお、数値の 0 は存在しており使用可能であるため、特別に扱われることはなく、truthy です。

コレクション、オブジェクト、文字列を表す値については、"空" の値はfalsy とみなされます。 これは、空の値に遭遇したときに、デフォルト値を割り当てたい場合に便利です。

$phone:=$emp.phone || "n/a"