FANDOM


Scripters_cafeログ


08/04/26 編集

Voodoo呪術の挙動の確認関連で、演算の優先順について以下のようなスクリプトで調べていました。

default {
    state_entry() {
        string test = "12345";
        string ret = test    // (1)
            + llGetSubString( test, 0, 0 )   // (2)
            + llGetSubString( (test="") + test, 0, 0 )  // (3)
            + test;     // (4)
        llOwnerSay( ret );
    }
}

このスクリプトを実行すると、次のような結果が表示されます。

112345

この結果から、以下のような順番で演算が行われていることが分かります。

  1. (4)部分が評価される。(test の内容「12345」がそのまま連結)
  2. (3)のパラメータ部分が評価される
    1. (test="") + test の演算が行われる
      1. (test="") の結果(空文字列)と、VMに保存されたtestの内容「12345」が連結され、結果は「12345」となり、同時にtest変数の内容が空文字列に設定される
  3. (3)の関数が実行される。戻り値は「1」
  4. (2)のパラメータ部分が評価される。
    1. この時点でtest変数は空文字列になっている。
  5. (2)の関数が実行される。戻り値は空文字列。
  6. (1)が評価される。この時点ではtest変数は空文字列。

この結果、ret変数に「112345」という文字列が設定されるという結果になっています。

以下のニーモニックダンプで確認してみます。

01 Function Args: 
02 Local List: ss
03 STATES
04 default:
05 EVENTS
06 state_entry()
07 PUSHARGS "12345"
08 STORESP 0 [test]
09 PUSHS 0 [test]
10 PUSHE
11 PUSHE
12 PUSHBP
13 PUSHS 0 [test]
14 PUSHARGS ""
15 STORES 0 [test]
16 ADD string, string
17 PUSHARGI 0
18 PUSHARGI 0
19 PUSHARGE 0
20 PUSHSP
21 PUSHARGI 12
22 ADD integer, integer
23 POPBP
24 CALLLID llGetSubString, 94
25 POPBP
26 PUSHE
27 PUSHE
28 PUSHBP
29 PUSHS 0 [test]
30 PUSHARGI 0
31 PUSHARGI 0
32 PUSHARGE 0
33 PUSHSP
34 PUSHARGI 12
35 ADD integer, integer
36 POPBP
37 CALLLID llGetSubString, 94
38 POPBP
39 PUSHS 0 [test]
40 ADD string, string
41 ADD string, string
42 ADD string, string
43 STORESP 4 [ret]
44 PUSHE
45 PUSHBP
46 PUSHS 4 [ret]
47 PUSHARGE 0
48 PUSHSP
49 PUSHARGI 4
50 ADD integer, integer
51 POPBP
52 CALLLID llOwnerSay, 292
53 POPBP
54 POPSPOPSRETURN
  • 行09 (4)の処理
  • 行13 (3)のtest変数をスタックへ。(この時点で変数のコピーがVMに保存されている)
  • 行14 15 (3)のVoodoo呪術部分。test変数を空文字列に設定。
  • 行24 (3)のllGetSubString呼び出し
  • 行29 (2)のtest変数をスタックへ。(この時点でのtest変数本体は空文字列)
  • 行37 (2)のllGetSubString呼び出し
  • 行39 (1)のtest変数をスタックへ。(この時点でのtest変数本体は空文字列)
  • 行40 41 42 文字列を結合


ちなみに、ほぼ同じプログラムをPHPで記述した場合、実行結果は「123451」となります。


【参考】

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki