代入は、一般に、変数が、その存続期間とスコープ内のさまざまな時点で、さまざまな値を保持できるようにします。
単一代入命令文
代入文は、変数(単純や、インデックス付きや、byref 関数の結果も)と式(変数、定数、演算子、括弧 で構築)で構成されます:
変数 = 式
代入命令文を実行すると、右側の式が評価され、左側の変数に割り当てられます。
代入操作の場合、式の値が明確に定義され(有効な '右辺値' である)そして、変数が変更可能なエンティティを表す(有効な変更可能な(定数でない) '左辺値' である)必要があります 。
代入が適切に形成されるには、右側の式の型が、左側の変数の型と互換性がある必要があります(つまり、式を変数の型に型変換できる必要があります)。
単純な代入の例は次のとおりです:
x = 0
上記の例では、変数
'x' は数値型として宣言する必要があります。
代入命令文の実行後、変数
'x' の値は、ゼロになります(その型に応じて、整数または浮動小数点値として)。
代入命令文で:
- 式は、プログラムの現在の状態で評価されます。
- 変数に計算値が割り当てられ、その変数の以前の値が置き換えられます。
右側が最初に評価されるので、次のように記述することで変数を増大できます:
x = x + 1
複合代入命令文
算術演算子は、複合算術演算および代入演算で使えます。
たとえば、次の複合の加算と代入の例を考えてみましょう:
x += 7
上記の複合算術および代入命令文は、次の長い形式と同等です:
x = x + 7
より一般的な、複合形式(演算子 op を使用):
x op= y
以下と同等です:
x = x op y
複合文は、長い形式が有効ならば、常に使えます。
これには、操作
'x op y' 自体が正しい形式である必要があり、操作の結果が
'x' に代入できる必要があります。
代入と等号
等号
'=' を代入演算子として使うことは、同等の比較としての等号と衝突するので、頻繁に批判されています。
これは、初心者がコードを書く際の混乱と、経験豊富なプログラマーがコードを読む際の混乱の、両方をもたらします。
'=' は、数学の平等を意味するので、初心者プログラマーは、代入を等号の関係演算子と混同することがあります。ただ、多くの言語で、
'=' は、代入に使われています。
代入では、変数の値が変更される一方、等価テストでは、2つの式の値が同じかどうかがテストされます。
FreeBASIC では、通常、単一の等号
'=' が、代入演算子と等値関係演算子の両方に使われ、文脈で、どちらを意味するかが決定されます。
これを改善するため(およびパーサーのあいまいさのいくつかのケースを解決するため)、
'=' の代わりに、代替シンボル
'=>' を代入に使えます(宣言内のイニシャライザーで既に一般的に使われているものと同じです)。
注:既存の、 '<=' (演算子「以下」)および
':=' (
':' は命令文の区切り文字)に対して、
'=>' 記号が採用されています。
命令文には、代入演算子と等価演算子を混在させることができます。
例えば:
x = a = b
次のように解析されます:
x = ( a = b )
上記の等式
'a = b' は、変数
'a' と
'b' の型に応じて、
'-1' か '0', または
'true' か 'false'を返しますが、これらの変数の値は 変更されません。
等価式の結果だけが、
'x' に代入されます。
上記の代入命令文で、等式を囲む括弧を使うと、グローバルな動作を強調できます。
代替記号
'=>' も使えます:
x => a = b
('=>' は、等値演算子のシンボルとしては使えません)
例
さまざまなケースを示す例:
Dim As Integer x, y, z
x = 5 '' (or 'x => 5')
Print x '' 5 (assignment expression is a constant)
y = x + 4 '' (or 'y => x + 4')
Print y '' 9 (assignment expression is the sum of a variable and a constant)
y = y + 3 '' (or 'y => y + 3')
Print y '' 12 (value of x is incremented by 3)
z = 3 '' (or 'z => 3')
z *= x '' (or 'z *=> x')
Print z '' 15 (value of z is multiplied by value of x)
If x = y Then '' (value of x is not modified)
Print x
Else
Print x, y '' 5 12
End If
x = y = z '' (or 'x => y = z') (value of y is not modified)
Print x, y, z '' 0 12 15
参照