投稿
Godot orz_127
別の投稿「FILES "//"」で本題とは違う所ばかりコメントが伸びたので別記事にしました。 DIM A[1],B[2] A[0]=1:B[0]=2:B[1]=3 ?B[LEN(A)==1]+SHIFT(A) このとき配列Aのサイズが1なので[]内は真(==1)で左側が3。次に配列Aから要素をとりだすので右側は1。足したら4の筈が、何故か3。 簡単に検証して見ました。
4そうだね
プレイ済み
返信[1]
親投稿
Godot orz_127
演算子の順、演算子の優先順位がない場合は左からと思い込んでいましたが、実は演算子区切りで右側から値を出して、一通り値がでたら、演算子の順に計算と言う事みたいです。 但し「&&」(恐らく「||」も)は左から順に評価されるようです。 「&&」の場合は、左側が偽になったら右側は実行しないようです。
0そうだね
プレイ済み
返信[2]
親投稿
スー thanks_0u0
うーん、関数が右側から展開されて、それから演算子の優先順に従って計算、っていう流れなのでしょうか(´=ω=`) こういう細かい仕様も公式で何処かに書いてくれると良いですね(u_u)
0そうだね
プレイ済み
返信[3]
親投稿
Godot orz_127
関数がと言うより、演算子区切りとして右側からリテラル化(でよいのかな?)してその後、演算子にしたがって計算のような。 なので投稿文にあるようにお互いが影響を受ける様な場合…思わぬバグをうみそうです^^;
0そうだね
プレイ済み
返信[4]
親投稿
スー thanks_0u0
DIVやMODも両辺に少数がある場合整数に直してから計算でしたし、単項の処理が最優先なんですね、きっと。 それにしてもなぜ右側からなのでしょう、不思議です(´ω`) 知らないとうっかりハマりそうな情報をありがとうございます( ´ ▽ ` )ノ
0そうだね
プレイ済み
返信[5]
親投稿
けい kei0baisoku
元投稿へのコメントと被るところもありますが一応こちらにも…… ポイントは「+演算子の左右の項の評価順」という理解で合ってますでしょうか? 要点は以下になると思います。 ・プチコン3号で演算子前後の評価順のルールが書かれているのは&&と||のみ。(言語仕様ページより) ・演算子前後や関数の引数の評価順は、仕様が明記されていない限りは未定義。(プチコンに限らず) ・未定義なので「左から」でも「右から」でもない。例えば実行する度に毎回変わる可能性もある。その行全体の結果も未定義になる。 そうは言ってもプチコンだと内部で決めてそうな気はしますが、言語仕様として確認が取れない限りは極めて危ない書き方になりますので、全力で避けた方がいいです。 あともし仕様の確認が取れていても、今回みたいに一画面に収めたいなど特別な理由がない限りは、バグを生みやすいので素直に分けるのをオススメしたいです(´ω`)
1そうだね
プレイ済み
返信[6]
親投稿
Godot orz_127
>けいさん 15行目、16行目を見ていただくとわかると思いますが、+でも*でもおなじで、+に限らず、演算子と言う括りの様です。 3つの項を2つの演算子で並べたら、演算子や()の状況に影響されず、右側から項がリテラルになるまて評価されて(この表現であっているのか不明ですが^^;)、その後演算子の優先順位で計算されている様です。 仕様で明言されていないところなので、他のパターンとの組み合わせで処理が変わったり、今後のアプデ等で変更されても文句は言えない部分ですが、現在はこの様に構文解析されて評価されている様です。 いずれにせよ、ひとつの式の中に結果が影響しあう項は入れない方が良いようです。
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
>Godotさん ありがとうございます。 すみません、コメント説明の所だけ読んで、写真のソースは同じだと思ってちゃんと見てませんでした(^^; 主旨は「演算子前後の評価順は未定義」ですので差し支えありません。 演算子の優先順位とも関係無い動きだったのですね。こんな感じのトリッキーな書き方は、やむを得ない理由がない限りは避けた方がいいというのは全く同感です。 少し気になったので一点だけ、結論として「今のところ右から評価される仕組み」と認識されているような印象を受けたのですが、"未定義"ですので正確には「どのように動くか分からない」になるのではと考えています。どうでしょうか? 言い換えますと、もし写真のテストプログラムを今からもう一度走らせて、今度は左から評価されたとしても「うん、まあそうなるよね」という意味です。 (今後仕様が変わるかも知れない、とは似ているようで本質的に異なると考えてます)
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
未定義だからどう動くか判らないは、仕様上の話だと思っています。 実際はランダムに動いているわけではなく、現状のプログラム処理によって動いている筈です。アプデ等で変わってしまう可能性は充分ありますが、それでも、それまでは現状の動作を続ける筈です。 おおざつぱに、それも演算子にしても+と*しか確認していませんが、構文解析処理でまず演算子と項の部分を分離してスタックに積んで、次の処理でスタツクから取り出しながら項をリテラルになるまで評価して(もしくは、再起呼び出しでまず行きで、演算子と項を分離して、帰りに項をリテラルにしている可能性もありますが)いるのだろうと仮定すると、あながち間違いではないかなと。 細かく検証したら違う動きも見えるかも知れませんが、追求しても仕方ない所だし、この動きに頼る事はないと思うので、とりあえず、現状の動作として結論付けた感じです。
0そうだね
プレイ済み
返信[9]
親投稿
けい kei0baisoku
>Godotさん なるほど。了解です。 一応念のため、私も、少なくとも次の更新までに違う挙動を見せる可能性は低いと思ってますし、Godotさんの「構文解析で~評価している」の推察も、聞いてとても腑に落ちました。 その可能性が高いと思います。 なので私が心配しているのは、結論として「少なくとも今は○○という動きをする」という言い方が問題無いかどうかの、表現の仕方の部分に近いです。
0そうだね
プレイ済み
返信[10]
親投稿
けい kei0baisoku
これは可能性が高いと思ってるわけではなく例えばですが、「今の仕様」が例えば、「リテラルの長い方から先に評価される」や「項を評価する際に使えるCPUが2つあり、左と右でその時空いている方から行なわれる」という仕様だと、状況次第でどれが先かは仕様通り動いても可変になります。 つまり、何らかの仕様で動いてはいるけれど、その仕様が「順番が毎回固定」であることの保証自体もないので、法則があると表現するのがまずいのではと感じた次第です。
0そうだね
プレイ済み
返信[11]
親投稿
けい kei0baisoku
……と、ここまで長々と力説しておいてなんですが、言いながら私もうすうす、気にし過ぎじゃねぇのという気はしてきてます(^^; 実際、仕様が分からない部分ならほかにもたくさんありますし。 ただ「関数の引数の評価順」と「式の中の項の評価順」の2つだけは、保証が無いのに法則があると思って組むと恐ろしい目に遭うので極端に気になってるのかもしれません(-_-) (長々と申し訳ないです…)
0そうだね
プレイ済み
返信[12]
親投稿
Oskar oskar_liebig
昨日、ちょっと面白い音楽プログラムの投稿がありました(投稿者はみきさん(ifconfig))。 実は、これ、関数呼び出しの評価順序に依存していて、社長の胸先三寸で音楽が変わってしまう可能性があるのですが、おそらく変化したとしても感動は変わらないんだろうなーと思ったのでした。 鼻から悪魔を超越するプログラムってのもあるんですね。
0そうだね
プレイ済み