::mayukoの小ネタ 計算の方法?演算子について

   
  

 投稿者 ::mayuko

if-elseのお話が出ましたので。
条件式で必要な演算子(関係&理論)の話をしようかと思います。

まずは関係演算子と言われてるものです。

> より大きい
>= 以上
< より小さい
< = 以下
== 等しい
!= 等しくない

です。
この関係演算子とは2つの値を比較してかの値を返します。
関係演算子は浮動少数型、整数型で使用しますが
大きいのか、以上なのか、小さいのか、以下なのか
等しいのか、等しくないのか
これをTRUE(真)FALSE(偽)かで判断します。
等しいの”==”と”!=”は文字列型でも使用できます。

理論演算子

理論演算子は真や偽の値を結合します。
&& 理論積(and)
|| 理論和(or)
! 否定(not)

です。

例題はこんな感じで

理論積の”&&”は両方真ならば真と返します。

(ホイットはスケベ(真) && ホイットはエッチ(真))
ならば真と返します。
左右に配置した条件式が両方とも真ならば真(1)と返します。

(ホイットはスケベ(真) && ホイットは紳士(偽))
これは左右の条件式の片側に偽があるので偽(0)と返します。

(ホイットはカッコイイ(偽) && ホイットは紳士(偽))
両方とも偽の場合は偽(0)と返します。

理論和の”||”はどちらかが真ならば真と返します。

(ホイットはスケベ(真) || ホイットはエッチ(真))
は、真(1)と返します。

(ホイットはスケベ(真) && ホイットは紳士(偽))
これでも片側が真なので真(1)と返します。

(ホイットはカッコイイ(偽) && ホイットは紳士(偽))
両方とも偽の場合は偽(0)と返します。

否定の”!”はもしも真(1)の答えならば偽(0)と答え
偽(0)ならば真(1)と答えます。

つまり当てはまった答えを否定するという意味です。

if(!"ホイットは紳士(偽)"){
llOwnerSay("いいえ、ホイットはスケベです。");
}

if(!"ホイットはスケベ(真)"){
llOwnerSay("いいえ、ホイットは紳士です。");
}

となりますw

この関係演算子と理論演算子は主にif(条件式)の
この条件式の部分で使用します。
*else ifはif文の見やすい段組の結果のかたちなので
if文と一括りにして説明しちゃいます:)
条件式に入る最終的な値は
TRUE(真)かFALSE(偽)の2通りとなり
数式で書くと
TRUE(1)かFALSE(0)となります。

その他の演算子
その他のと括るのはちょっち弊害があるのですが><
条件文で必要なものから書いちゃったので許してください;;

これ以外にもプログラムをかこー!と思うと
必要な演算子というものがあります。

算術演算子(2項演算)

もちろんコンピュータは大きな計算機ですから、普通に計算とか
出来るわけですw

+(プラス)
-(マイナス)
*(掛け算)*これで掛け算の意味で×は使いませんw
/(割り算)÷ではないですw
%(割り算の余り)*整数型しか使えません。

があります。
なので、イベントやif-else文のブロックの中で
何かを計算して、その答えの値を使用することが出来ます。
ここの算術演算子でちょっち変わり者が+です。
この+に関してはlistや文字列型をくっつけると言うことが出来ます。
また-(マイナス)は正負を反転させる単項演算(後述)としても使えます。
そしてここが最初間違えやすいのですが
=(イコール)は等号としてプログラムでは使用できません。
=は代入として使って、等号が必要な場合は==を使用します。

文字列の連結として+を使用する例

string Howitt;
default
{
	touch_start(integer total_number)
	{
	Howitt = "スケベ"+"エッチ";
	llOwnerSay(Howitt);
	}
}

listの連結として+を使用する例

list Howitt;
default
{
	touch_start(integer total_number)
	{
	Howitt = ["スケベ"]+["エッチ"];
	llOwnerSay((string)Howitt);
	}
}

スケベエッチとしゃべりますw

正負を反転させる単項演算としての-の例

default
{
	touch_start(integer total_number)
	{
	integer i= 10;
	i =-i;
	llOwnerSay((string)i);
	}
}

-10としゃべります。

インクリメント、デクリメント演算子(単項演算)
今までのご説明の演算子はAとBを比べたら?とかAとBを足したら?引いたら?
の2項演算と呼ばれるものの説明でした。
これがAなどひとつだけに作用して計算するものを単項演算と呼びます

簡単に1を増やす、1を減らすという計算はこんな風に単純に書くことが出来ます。

1を増やすの場合
このようなものをインクリメントと呼び、こんな風に書くことが出来ます。

++1;
1++;

また1を減らすものは

--1;
1--;

と書くことが出来て、これをデクリメントと呼びます。

このような感じで単独で使用する場合にはどちらを使用しても結果が変わらないので
あまり意識する必要はないのですが、
先に+ +や- -がある場合とうしろに+ +、- -がある場合で
単独使用以外の組み合わせだと
先に処理してるのか後で処理しているのかの違いで
答えが変わるので注意が必要です;;

a=++b;
の場合は

b=b+1;
a=b;

という順番で計算しています。

a=b++;
の場合は

a=b;
b=b+1;

という順番で計算していますので
bがもしも10ならばの結果が
a=++b;
aの結果が11
a=b++;
の場合はaの結果が10と答えます。

++が先処理か後処理かの違いの証明。

default
{
    touch_start(integer total_number)
	{
		integer a;
		integer b =10;
		a=b++;
		llOwnerSay("a=b++;のa"+(string)a);
		a =0;
		b =10;
		a=++b;
		llOwnerSay("a=++b;のa"+(string)a);

	}
}

このインクリメントデクリメントの演算は
forとかwhileという繰り返し処理の制御文などで良く使用します。

そのほかにもビット演算子、シフト演算子なんて高度な演算もLSLで
出来たりします。

& (ビットごとの)理論積
| 理論和
^ 排他的理論和
~ 否定

< < 左シフト演算子

>> 右シフト演算子

この2つの演算子は普段めったに使うことは無いと思いますが、
これらを使用すると計算処理の負担があまりかからないと言われます。
なぜならこのビット演算、シフト演算は
コンピュータの内部処理そのものの2進法です。

LSLでは特定のイベント*changed、controlなど
の引数で使用することがありますので
あーそんなのもあるんだなぁなどとさらーと覚えておくとよいと思います:)

さて、演算子のことをざーっと書いてみました。
で、結局計算してその数をどうやって出力したらいいの?って疑問があるかと思います。
さっきからllOwnerSayで数字を書き出していますが、ここで型変換(キャスト変換)
というものをしています。

次はこの型変換について書いてみたいと思います:)



関連する投稿


セカンドライフ土地レンタルのSLingトップへ戻る

Leave a Reply

You must be logged in to post a comment.