引数の評価順序

プログラミング言語で、関数の引数を右と左のどちらから評価するのかに関するやりとり。誰でも編集できるので、適宜足して下さい。
引数 言語 関数 プログラミング 評価順序
kazu_yamamoto 7442view 6コメント
  • 5
  • お気に入り
12

限定公開の新機能が大好評!

プライベートなツイートまとめの共有がもっと簡単になりました。フォロワーだけに特別なまとめを公開しませんか?メンバー限定はメニューから設定可能です。詳細はこちら

ログインして広告を非表示にする

コメント

  • kartis56 @kartis56 2013-10-03 17:46:13
    最後のほうで書かれてるとおり、式が書いてある通りに最適化すると、二つの代入だけ先に実行して 結果はx+x になるよね…
  • でき @dekijp 2013-10-04 08:47:00
    昔、 x+++y は (x++)+yなのか? x+(++y)なのか?って話あったなぁ
  • Tsuyoshi CHO @tsuyoshi_cho 2013-10-06 22:30:51
    こういうのは一時変数にちゃんと保持すること... > 自分
  • uehaj @uehaj 2016-01-29 14:08:18
    C言語(C呼び出し規約;cdecl)で右から左に評価する理由は、可変長引数があるから。 スタックトップに近い方が第一引数になる。 hoge(a,b,c)のとき TOP->a b c で、push(c)push(b)push(a)することで、 第一引数:TOP 第二引数:TOP-1 第二引数:TOP-3 というように、何個あるかわからない引数を参照できる。
  • uehaj @uehaj 2016-01-29 14:08:43
    pascallには可変長引数がないので、上記にする必然性はない。 cdecl規約の特徴として、呼び出し側しか引数の個数をしらないので、引数のPOPを呼び出し側が実施する義務を負う。(引数のPOPはかならず行なわなければならず、呼び出される関数側でやった方が本来重複がなくコード量が減るが、cdecl規約ではそうできない。pascal規約では呼ばれる関数が引数をPOPする(スタックトップを戻す))
  • uehaj @uehaj 2016-01-29 14:09:01
    なお、Cでも引数のpushをせず、スタックトップ相対でmovすれば、評価順序が上記である必然性はない。おそらく現代的なコンパイラはそうしているのではないかな。PUSHの方がコードジェネレータを簡潔にできたので昔の素朴なコンパイラはそうしていたというだけ。

カテゴリーからまとめを探す

ログインして広告を非表示にする
ログインして広告を非表示にする