[変数] について

(6)[変数]
変数はプログラム中で変化するデータを格納します。名前は半角の英字から始まる英数字の
並びで、長さはあまり長くない 40文字以内程度。変数は定数と同様に型分類されます。
変数は、演算、参照などに使うことができます。
なお、変数に値を格納する(入れる)前は、数値変数の値は 0、文字変数は
ヌルストリング(空の文字列)であるものとみなされます。
 
  (6.1)変数名 
変数名は長さ 40文字以内の、1バイト系英数字とピリオド(.)の組み合わせで表されます。
ただし、変数名の始めの 1文字は英字でなくてはなりません。
この規約に従って名前をつけられた変数は、すべて区別されます。
例えば次の2つの変数は異なった変数名として解釈されます。
 COUNTER.OF.TABLE.DATA.001
 COUNTER.OF.TABLE.DATA.002

さらに、BASICの予約語や半角英数字文字以外は使用できません。
および、FNで始まる変数名は許されません。(DEF FNのコマンド参照)

  (6.2)変数の型
Variable type.
   型宣言の接尾文字は文字型は$ 、整数型は% 、単精度実数型は! 、倍精度実数型は#です。
   これは型宣言命令の文字型宣言文より優先します。


型宣言命令の文字型宣言文[DEFSTR]
整数型宣言文[DEFINT]
単精度実数型宣言文[DEFSNG]
倍精度型宣言文[DEFDBL]
に指定された文字から始まる変数の型は、型宣言の接尾文字の次に優先します。
 なお、宣言をしない変数は単精度型と扱います。
 例えば、DEFINT I-L      これは、整数型のInitial宣言文
     L#=1234567.891    これは、DEFINT I-L 文より優先
     S=-123.45       これは、宣言無きため単精度実数型
     I1=12*3        これは、DEFINT I-L 文に従う
 
 
 (10)式と演算
(10.1)算術演算
  算術演算には次のようなものがあり、示された順序に基づいて演算を行います。
  尚、算術式の中に文字定数や文字変数が入ってはいけません。

実行優先順序

算術演算子

演算内容

1.

^

指数(べき乗)演算

X^Y  3^2

2.

-

負号

-3.7

3.

*
/

乗算
実数の除算

X*Y  3*7
X/Y  3/7

4.

+
-

加算
減算

X+Y  3+7
X-Y  3-7


整数の除算と剰余の計算

実行優先順序

算術演算子

演算内容

1.

\

整数の除算

10\3 =3

2.

MOD

整数の剰余

10 MOD 3 =1



(10.2)関係演算
2つの数値を比較するときに使用。関係演算結果は、真(-1)、偽(0)で得ら
れ、IF文に使用します。
[IF_THEN〜ELSEコマンド][IF_GOTO〜ELSEコマンド] を参照。

関係演算子

演算内容

=

等しい

X=Y

<>または><

等しくない

X<>Y または X><Y

<

小さい

X<Y

>

大きい

X>Y

<= または =<

以下

X<=Y または X=<Y

>= または =>

以上

X>=Y または X=>Y



例えば IF X=0 THEN 100
    IF (A+B)<>0 THEN X=X+1:Y=Y+1
   
(10.3)論理演算
Bit操作や2進演算を行います。複数の関係演算子を結合して複合条件を判定した
りするのに使用します。
  NOT、AND、OR、XOR、IMP、EQVがあります。
  論理演算子は、扱う数値を-32768〜+32767の 2の補数表示の整数に変換し、Bit演
算をします。この範囲外の数値はOverflow Errorとなります。
  2Byte、16Bitの 2進表記に対して、各Bitごとに以下の演算を行います。

NOT

(否定)

X

NOT X

0

1

1

0




AND

 

and
(論理積)

X

Y

X AND Y

1

1

1

1

0

0

0

1

0

0

0

0




OR

 

or
(論理和)

X

Y

X OR Y

1

1

1

1

0

1

0

1

1

0

0

0




XOR

 

exclusive or
(排他的論理和)

X

Y

X XOR Y

1

1

0

1

0

1

0

1

1

0

0

0




IMP

 

implication
(包含)

X

Y

X IMP Y

1

1

1

1

0

0

0

1

1

0

0

1




EQV

 

equivalence
(同値)

X

Y

X IMP Y

1

1

1

1

0

0

0

1

0

0

0

1




論理演算を利用することにより、バイトデータをあるビットパターンに照らし合わせて
調べることができます。
例えば、AND演算子は機器の入出力ポートのステータスバイトの必要なビット以外の
すべてのビットをマスクするのに使用出来ます。
また OR演算子はある2進数を作るために 2つのビットパターンを混合するのに使うことが
できます。
以下に、論理演算子がどのように働くかの例を示します。演算がビットごとに行われている
ようすに注意してください。

-1 OR 0 = -1 -1= (1111 1111 1111 1111) 2進表示
  0= (0000 0000 0000 0000) 2進表示
  -1 OR 0= (1111 1111 1111 1111) 2進表示
48 AND 24 = 16 48= (0000 0000 0011 0000) 2進表示
  24= (0000 0000 0001 1000) 2進表示
  48 AND 24= (0000 0000 0001 0000) 2進表示
15 XOR 60 = 51 15= (0000 0000 0000 1111) 2進表示
  60= (0000 0000 0011 1100) 2進表示
  15 XOR 60= (0000 0000 0011 0011) 2進表示
17 EQV 12 = -30 17= (0000 0000 0001 0001) 2進表示
  12= (0000 0000 0000 1100) 2進表示
  17 EQV 12= (1111 1111 1110 0010) 2進表示
28 IMP  9= -21 28= (0000 0000 0001 1100) 2進表示
  9= (0000 0000 0000 1001) 2進表示
  28 IMP  9= (1111 1111 1110 1011) 2進表示
NOT 23 =-24 23= (0000 0000 0001 0111) 2進表示
  NOT 23= (1111 1111 1110 1000) 2進表示

 
 論理演算で、もし、0(偽)と-1(真)しか与えられなかったなら、扱う整数値の
16ビット全部について同一の演算が行われることになり、演算の結果は 0か -1のどちらかと
となります(前例の -1 OR 0を参照)。
 0は全ビット 0、-1は全ビット 1 です。
したがって、論理演算子で2つ以上の関係演算を結ぶようにして使用することにより、
複合条件によってプログラムの流れを変えるのに用いることができます。
例)
 IF X<0 OR X>99 THEN 200   これは、X<0 か X>99 のとき行番号200に分岐
 
 IF 0<X AND X<100 THEN X=0  これは、0 < X < 100のとき、Xに0を代入する。
 
 IF NOT ( A=0) THEN 400    これは、A が 0以外のとき400に分岐
 
 
 (10.4)関数 Function.
関数とは、指定されたある値(これを関数の引数(ひきすう)という)に対して、ある決まった
演算を行い、その演算の結果を得ることができるものです(ただし、関数によっては、引数を
必要としないものもあります)。
 関数は、演算子を使用する他の演算とは異なり、実行後にそれ自身が値をもつ、一種の命令
として扱われます。したがって、ふつうの命令のように機能別に決められた名前をもっていま
す。
N88-BASIC(86)には、SIN (正弦)、SQR (平方根)などの数値関数や、CHR$、LEFT$などの
文字列関数といった"組み込み関数"が用意されています。これらの関数については第3章で
通常の命令とともに詳しく説明されています。
 また、"ユーザー定義関数"としてユーザーが自由に定義できる関数機能もあります。これは
第3章 DEF FN の項で説明します。
 なお、初等関数(SIN関数などの数学関数)では、引数が整数や単精度のときは単精度の結果
が得られますが、引数が倍精度のときは倍精度の結果を得ることができます。
ただし、MBASIC86では、数値関数では、内部では倍精度実数値で計算されています。
 例)
  A=SIN(3.1416)+COS(3.13416)
  PRINT 2, 2*2, SQR(2)

 
 (10.5)文字列の演算
 BASICでは、文字列に対して、演算を行うことができます。
 ◆文字列の連結
 例)
 10 A$="SUPER":B$="PERSONAL":C$="COMPUTER"
 20 D$=A$+"-""+B$+"-"+C$
 30 PRINT D$
 RUN
 SUPER-PERSONAL-COMPUTER
 
 ◆文字列の比較
 文字も、数値の比較と同様に比較出来ます。
 =, <, >, <>, ><, <=, =<, >=, =>

 文字列の場合、文字列の最初から1文字ずつ比較します。両者が全く同じ文字列の
場合は等しく、1個所でも違う場合、文字のキャラクターコードにより大小を決めます。
文字列の片方が短くて比較が途中で終わった場合は、短い文字列の方が小さくなります。
 文字列の比較においては、空白なども意味をもちますから注意してください。
次の例は、すべて真(-1)となります。
 例)
 "AA"<"AB"
 "BASIC"="BASIC"
 "X&">"X#"
 "PEN&nbst">"PEN"
 "cm">"CM"
 "DESK"<"DESKS"
 
 文字列の比較は、文字列の内容を調べたり、文字をアルファベット順に並べたり(ソート)す
るのに使います。
 
 (10.6)演算の優先順位
 

1.

カッコで囲まれた式

 

2.

関数

 

3.

^

指数

4.

-

負号

5.

*
/

乗算
除算

6.

\

整数の除算の商

7.

MOD

整数の除算の剰余

8.

+
-

加算
減算

9.

関係演算子

<,>,= など

10.

NOT

 

11.

AND

 

12.

OR

 

13.

XOR

 

14.

IMP

 

15.

EQV

 


 
 
 (13)ラベル名

 N88-BASIC(86)では、プログラムの分岐先として使用する行番号の代わりに
"ラベル名" を使用できます。
あるルーチンの始まりなどに意味のあるラベル名をつけておけば、いちいち行番号を
覚えておかなくともよく、またRENUM で行番号のつけ替えを行ってもそのたびに新しい
行番号を確かめる必要もなくなるため、プログラムの作成を非常に楽に行うことができます。
後でプログラムの修正などを行うときにもたいへん有利です。
次の例を参照して下さい。
 まず、ラベル名を使わないで、ふつうに行番号を分岐先として用いたプログラムを
例として示します。

 10 INPUT A
 20 IF A<0 THEN 80
 30 IF A>0 THEN 60
 40 PRINT "zero"
 50 GOTO 90
 60 PRINT "plus"
 70 GOTO 90
 80 PRINT "minus"
 90 END
 
 これは、10行で入力された値が正か負か0かを調べるプログラムです。ここで処理の流れを
変える命令が20、30、50、70行で使われていて、その分岐先の指定はすべて行番号になって
います。
 これを、ラベル名を使用すると、次のようになります。

 10 INPUT A
 20 IF A<0 THEN *MINUS
 30 IF A>0 THEN *PLUS
 40 PRINT "zero"
 50 GOTO *EXIT
 60 *PLUS:PRINT "plus"
 70 GOTO *EXIT
 80 *MINUS:PRINT "minus"
 90 *EXIT:END
 
 ラベル名の使用のルールは次のとうりです。
 [1] ラベル名の頭にはアスタリスク(*)をつけねばなりません。
 [2]先頭のアスタリスクを除いて、ラベル名は必ず1バイト系の英文字で始まらねばならない。
 [3]ラベル名に使用出来る文字は、先頭のアスタリスクを除いて、1バイト系の英文字と数字
とピリオド(.) であり、大文字と小文字の区別はありません。
 [4]予約後をラベルとして使用できません。
 [5]ラベル名の長さは、プログラムの1行の記述範囲内であれば問わない。
 [6]参照されるラベル名(呼ばれる方のラベル名)は、行番号を除外して行の最初になければ
ならない。
 [7]1行中でラベル名の後に続けて命令を記述し、マルチステートメントとするときは、コロ
ン(:)またはスペースにより区切らねばならない。
 
 A=1:GOTO *A1:A=2: *A1 PRINT A:END
 これを実行すれば 1と表示される。