引数の評価順序
- kazu_yamamoto
- 12498
- 2
- 7
- 4
(* さっきのCのコードは私の書いたコードじゃなくて、ネットで見かけた「プログラミング言語論」のスライドに載ってたやつでした
2013-10-02 10:43:24@chomado ・・・未規定だったか未定義だったかなのでああいうコードを書かないことを意識させるのが一番ですね。
2013-10-02 10:46:01.@kazu_yamamoto callee から見た時に stack の上の方に 1st arg が来ないと varargs の実装が複雑になります。右から評価だと、式評価→stack push を繰り返すだけに出来ますから push する大きさが変わっても平気(続く
2013-10-02 10:56:12.@kazu_yamamoto 承前)左から評価だと、frame の構造を踏まえた上で評価結果を stack frame の何処に流し込むのかを考える必要が出るかと思います。prototype 宣言の無い C の頃の昔話といえば昔話ですね…
2013-10-02 10:59:11実は、このコード https://t.co/PntG5OUZS7 を最初に見たとき、 7 0 だと思ったってことは秘密(恥)
2013-10-02 11:02:35@Cryolite # なお"一般的に評価順序が左から右になった"と解釈するマンが多発して、どこにそのような記述があるか探したマンがここにいますので後日yakinikutabetaiJP
2013-10-02 11:26:39うぎょぎょマジですかすいません……. 私が http://t.co/gxeZujvGAT で言及しているのは, [dcl.init.list]/4 (CWG DR1030 http://t.co/aHXMLJflOo ) のことで,当然これは関数呼び出し一般の話ではないです.
2013-10-02 11:35:38@kazu_yamamoto ほとんどは,右から評価してスタックに積むと思います.スタックトップ(アドレス若い方)に第一引数が来るようにしたいから.
2013-10-02 11:44:22.@Cryolite @cpp_akira むぅ Guru 達も悩んでおられる…一般民間人は素直に『引数の評価順は処理系依存、副作用入りの奴を書いた者には死』だと思っておけば間違いないに違いない(笑)
2013-10-02 11:57:33@objectxplosive @cpp_akira いえ,特に悩んではいなくて,単に「私が明らかに誤解を招く書き方をした」→「cpp_akira さんがそれを誤解して規格書で確認しないまま伝聞した」というだけの話です.
2013-10-02 12:05:25.@Cryolite @cpp_akira 順序規定があるのは初期化の所だけで、通常の関数呼び出しには(今まで通り)適用されない…という理解でいいのでしょうか?
2013-10-02 12:09:03@objectxplosive @cpp_akira 初期化の構文のうち,波括弧 (brace) によるものだけです.
2013-10-02 12:20:53. @chomado 手元でこのコード https://t.co/3Tk3904hoc 実行したら 8 4 になりました。
2013-10-02 13:13:07. @chomado 手元のgcc 4.1.2 では、 (x=3)+(x=4) という式は (1). xに3を代入する。 (2). xに4を代入する。 (3). xの値とxの値を足す。 という処理にコンパイルされるようです。
2013-10-02 13:22:37. @kazu_yamamoto @nom4476 関数の呼び出し規約を指示する修飾子のようです。 / c.f. 呼出規約 - Wikipedia http://t.co/P15QgsnPgK
2013-10-02 14:42:26