引数の評価順序

プログラミング言語で、関数の引数を右と左のどちらから評価するのかに関するやりとり。誰でも編集できるので、適宜足して下さい。
12
ちょまど@ ITエンジニア @chomado

(* さっきのCのコードは私の書いたコードじゃなくて、ネットで見かけた「プログラミング言語論」のスライドに載ってたやつでした

2013-10-02 10:43:24
Sosuke MORIGUCHI @chiguri

@chomado ・・・未規定だったか未定義だったかなのでああいうコードを書かないことを意識させるのが一番ですね。

2013-10-02 10:46:01
NaOHaq(苛性ソーダ) @NaOHaq

@chomado 同レス多数だと思いますが、(x=3)と(x=4)のどちらが先に実行されるか決まっていないためです

2013-10-02 10:49:18
きしもと @ksmakoto

@kazu_yamamoto 右から積むと、printfとかの場合に、スタックトップからの距離がわかりやすくなります

2013-10-02 10:51:33
山本和彦 @kazu_yamamoto

.@ksmakoto あー、なるほど。ありがとうございます。

2013-10-02 10:53:55
眼力 玉壱號 @objectxplosive

.@kazu_yamamoto callee から見た時に stack の上の方に 1st arg が来ないと varargs の実装が複雑になります。右から評価だと、式評価→stack push を繰り返すだけに出来ますから push する大きさが変わっても平気(続く

2013-10-02 10:56:12
眼力 玉壱號 @objectxplosive

.@kazu_yamamoto 承前)左から評価だと、frame の構造を踏まえた上で評価結果を stack frame の何処に流し込むのかを考える必要が出るかと思います。prototype 宣言の無い C の頃の昔話といえば昔話ですね…

2013-10-02 10:59:11
ちょまど@ ITエンジニア @chomado

実は、このコード https://t.co/PntG5OUZS7 を最初に見たとき、 7 0 だと思ったってことは秘密(恥)

2013-10-02 11:02:35
山本和彦 @kazu_yamamoto

.@objectxplosive なるほど。ありがとうございます。

2013-10-02 11:02:38
ちょまど@ ITエンジニア @chomado

@NaOHaq ふおおおヽ(;▽;)ノ解説ありがとうございますヽ(;▽;)ノ

2013-10-02 11:04:39
zak @zakkas783

@Cryolite # なお"一般的に評価順序が左から右になった"と解釈するマンが多発して、どこにそのような記述があるか探したマンがここにいますので後日yakinikutabetaiJP

2013-10-02 11:26:39
Akira Takahashi @cpp_akira

Cryoliteさん自分で言ってたやーん、と言おうとしたら

2013-10-02 11:35:35
Akso de la Malbono @Cryolite

うぎょぎょマジですかすいません……. 私が http://t.co/gxeZujvGAT で言及しているのは, [dcl.init.list]/4 (CWG DR1030 http://t.co/aHXMLJflOo ) のことで,当然これは関数呼び出し一般の話ではないです.

2013-10-02 11:35:38
Nomura @nom4476

@kazu_yamamoto ほとんどは,右から評価してスタックに積むと思います.スタックトップ(アドレス若い方)に第一引数が来るようにしたいから.

2013-10-02 11:44:22
眼力 玉壱號 @objectxplosive

.@Cryolite @cpp_akira むぅ Guru 達も悩んでおられる…一般民間人は素直に『引数の評価順は処理系依存、副作用入りの奴を書いた者には死』だと思っておけば間違いないに違いない(笑)

2013-10-02 11:57:33
Akso de la Malbono @Cryolite

@objectxplosive @cpp_akira いえ,特に悩んではいなくて,単に「私が明らかに誤解を招く書き方をした」→「cpp_akira さんがそれを誤解して規格書で確認しないまま伝聞した」というだけの話です.

2013-10-02 12:05:25
眼力 玉壱號 @objectxplosive

.@Cryolite @cpp_akira 順序規定があるのは初期化の所だけで、通常の関数呼び出しには(今まで通り)適用されない…という理解でいいのでしょうか?

2013-10-02 12:09:03
Akso de la Malbono @Cryolite

@objectxplosive @cpp_akira 初期化の構文のうち,波括弧 (brace) によるものだけです.

2013-10-02 12:20:53
NaOHaq(苛性ソーダ) @NaOHaq

. @chomado 手元でこのコード https://t.co/3Tk3904hoc 実行したら 8 4 になりました。

2013-10-02 13:13:07
NaOHaq(苛性ソーダ) @NaOHaq

. @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 cdecl ってよく見かけるけど何?

2013-10-02 14:37:14
NaOHaq(苛性ソーダ) @NaOHaq

. @kazu_yamamoto @nom4476 関数の呼び出し規約を指示する修飾子のようです。 / c.f. 呼出規約 - Wikipedia http://t.co/P15QgsnPgK

2013-10-02 14:42:26
山本和彦 @kazu_yamamoto

.@NaOHaq @nom4476 ありがとうございます。よく分かりました。

2013-10-02 14:48:44