実引数の評価順序の話

JavaC言語では、実引数の評価順序に違いがある話。

 しばらくJavaを勉強してみてJavaにはメソッドの実引数の評価順序がしっかり定義されていて感動しました。

 

評価順序とか関係あるの?

評価順序が変わったら動作が変わってしまうコードとか、害悪の極みですけど、関係あります。

gist43d36fa29e66e5514066f3307650b2fa

例えばC言語でこんなコードを書くと、評価順序によって実行結果が異なります。

もし評価順序が左から右なら、

x = 0

y = 10

z = 50

となります。

逆に評価順序が右から左なら、

x = 10

y = 10

z = 0

となります。

 

実は、C/C++では関数の実引数の評価順序は処理系定義になっています。

プロコンでこれをやらかすと手元ではACできるコードでも無限にWAを生やす沼にハマる恐れがあります。というかハマった。

それがJavaだときちんと定義されていて、左から右に評価するということになっています。

 

で、何に使うの?

そんなややこしい実引数の評価順序気にするくらいなら、わざわざ使わなかったら良いんじゃないの?っていうのは至極もっともな意見なんですけど、(おそらく)唯一これを使う分野があります。

そう、コードゴルフです。

 

コードゴルフとは

とにかく短いコードで正しい結果が得られるコードを書こうっていう競技です。

ソースコードのサイズが小さければ小さいほどよいので、スコアが低ければ低いほどよいゴルフと掛けて、コードゴルフと呼ばれます。

色んなショートコーディングのテクニックがあるので、一度やってみるとおもしろいですよ。

 

というわけで、Javaでメソッドの実引数は左から右の順に評価されるという話でした。