夢乃さんのスクリプト講座 ~refer編~

夢乃さん(@yumeno_star)によるreferの説明のログです
1
前へ 1 ・・ 3 4 次へ
む-にょ @meunyo

@pollyanna1991 たとえば hogehogehoge2(int input_a, int input_b, refer ans1, refer ans2){ ans1=a+1; ans2=b+1; } とかして、

2011-08-23 01:34:52
む-にょ @meunyo

@pollyanna1991 たとえば void event_sample(){ int ans1=0, ans2=0; for(int i=0;i<10;i++){ hogehogehoge2(ans1, ans2, ans1, ans2); } } などとすれば。

2011-08-23 01:35:45
む-にょ @meunyo

@pollyanna1991 こんなふうに変えれば、input_aはそのときのans1が代入されますし、input_bにはそのときのans2が代入されますから、期待されたとおり徐々に増えて行きます。

2011-08-23 01:37:57
うめたろー @pollyanna1991

さっきのだとevent_sampleでinput_aが0に初期化されちゃうから何回繰り返しても結果が同じなんだな

2011-08-23 01:36:05
む-にょ @meunyo

@pollyanna1991 そうですね、さっきのダメな例はa=0が変わらず、input_aがいつも0になっちゃうので結果が同じなんです。

2011-08-23 01:36:46
うめたろー @pollyanna1991

@yumeno_star これもさっきと同じように常に答えが1になってしまいませんか?

2011-08-23 01:38:36
む-にょ @meunyo

@pollyanna1991 for文が始まって最初のhogehogehoge2実行のとき、input_a に ans1(=0)が、input_bにans2(=0)が代入されます。

2011-08-23 01:40:37
む-にょ @meunyo

@pollyanna1991 順を追ってみましょうか。最初、for文開始前にans1=0, ans2=0ですね。

2011-08-23 01:39:19
うめたろー @pollyanna1991

1つーかむしろ式が成り立たない。ans1=ans2=a=b=0の状態に見えるもの

2011-08-23 01:40:41
む-にょ @meunyo

@pollyanna1991 =文字一個は、数学の等号ではなく、「右のデータを左の変数に代入」する操作を行うコマンドです。なので、等号とは違うと理解してください。

2011-08-23 01:41:58
む-にょ @meunyo

@pollyanna1991 だからこそ、 a=a+1; なんていう数学的には「なんじゃそらーーー!」って計算が成立します。

2011-08-23 01:43:55
む-にょ @meunyo

@pollyanna1991 先ほどの続きですが、同時に、hogehogehoge2内のans1としてevent_sampleのans1のメモリを使う、hogehogehoge2内のans2としてevent_sampleのans2のメモリを使うと設定されます。

2011-08-23 01:44:37
む-にょ @meunyo

@pollyanna1991 で、hogehogehoge2内ですが、input_a(この時点では=0)に1を足した結果をans1に代入し、input_b(この時点では=0)に1を足した結果をans2に代入しています。

2011-08-23 01:46:11
む-にょ @meunyo

@pollyanna1991 結果、referでメモリを共有してますので、event_sample側のans1も1、ans2も2に変わります。

2011-08-23 01:46:31
む-にょ @meunyo

@pollyanna1991 訂正 x input_b(この時点では=0)に1を足した結果をans2に代入しています。 o input_b(この時点では=0)に2を足した結果をans2に代入しています。

2011-08-23 01:47:30
む-にょ @meunyo

@pollyanna1991 i=0な1周目では、結局、ans1=1, ans2=2になって計算が終わりました。続いてi=1になって2周目

2011-08-23 01:48:48
む-にょ @meunyo

@pollyanna1991 hogehogehoge2実行時に、input_aはその時点でのans1の内容が代入されます。すなわち1が代入されます。input_bはその時点でのans2の内容が代入されます。すなわち2です。メモリの共有は同じ。

2011-08-23 01:50:16
うめたろー @pollyanna1991

@yumeno_star あー、勘違いしてました。hogehogehoge2内の後半の ans1, ans2は戻り値であって、式に直接代入される値ではないんですね。

2011-08-23 01:49:38
む-にょ @meunyo

@pollyanna1991 そうですそうです。ゆえに2周目の計算結果はhogehogehoge2の内部動作の説明を省くとans1=2, ans2=4に変わります。

2011-08-23 01:51:22
む-にょ @meunyo

@pollyanna1991 もひとつ書き方がありますね。 int hogehogehoge3(refer ans1, refer ans2){ ans1 = ans1+1; ans2 = ans2+2; }

2011-08-23 01:52:32
む-にょ @meunyo

@pollyanna1991 んでもって void event_sample(){ int ans1 = 0; ans2 = 0; for(int i=0; i<10; i++){ hogehogehoge3(ans1, ans2); } } こんなの。

2011-08-23 01:53:32
む-にょ @meunyo

@pollyanna1991 input_aの役もinput_bの役も、ans1. ans2にまとめてやらしちまえっていう方法です。

2011-08-23 01:54:12
む-にょ @meunyo

@pollyanna1991 しまった恥ずかしい。訂正 x int ans1=0; ans2=0; o int ans1=0, ans2=0;

2011-08-23 01:55:20
む-にょ @meunyo

ではひととおり説明できたので撤収しますかのう。

2011-08-23 01:56:41
前へ 1 ・・ 3 4 次へ