- - PR -
1行に代入文2個 これは何?
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-16 09:31
こんにちは。お世話になっております。
現在、昔の方が実装したソース(JDK1.4)の整理を行っています。 そのときに見慣れない、というか私が使ったことがないだけですが ロジックを見つけました。
コンパイルも通るし デバッグしてみたところ、どうやら true = (pattern1 == pattern2) らしいこともわかりました。 私なら
こうしているところです。 ここで質問です。 1) pattern1 = pattern2 = getPattern(); こういう書き方はありなのでしょうか。 良く使われるのでしょうか。 2) この書き方、何か呼び方とかあるんでしょうか。 同時代入とか? スレッドの趣旨とは少しずれますが 一つのナレッジになればと思い投稿いたしました。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2007-02-16 09:48
ありっちゃありだろうね。右から評価されるからできること。
Cとかやっていると結構見かけるんだけどなぁ。 | ||||||||||||
|
投稿日時: 2007-02-16 09:59
→こういう書き方はありなのでしょうか。 Java言語仕様で規定されている正しい文法です。 Java言語ではC/C++同様に代入は文ではなく式ですので、 このような書き方が可能です。 式は値を返すもの、文は値を返さないもので、 上記の式の意味は、 1. pattern2にgetPattern()の結果が代入される。 2. 「pattern2 = getPattern()」という代入式はその代入された値を返すので、 pattern1には「pattern2 = getPattern()」の式の値であるpattern2の値が代入される。 という意味になります。 →良く使われるのでしょうか。 同じ意味の値を一括して複数の変数に代入するのであれば優れた書き方だと思いますが、 同じ意味の値を一括して複数の変数に代入する必要のある場面は それほど多くはないので、良く使われるとまでは言えないように思います。 また、同値であっても意味が異なるのであれば、この書き方はすべきではないでしょう。 悪例) count = price = 0 (どちらも0で初期化したいだけだが、countとpriceはまったく別の用途に使うような場合、 無関係なものを一まとめにするのはよくない)
特別な呼び方は特にないように思いますが、 同時代入、一括代入などと呼ばれる方が多そうです。 (少しGoogleで検索してみた範囲では) -- ・タイプミスを修正 ・るぱんさんご指摘の多重代入の方がGoogle検索では結果件数が多いですね!! 言語仕様を考えると同時代入は正しくないし、一括代入よりも正確な言い回しのような気がしました。 [ メッセージ編集済み 編集者: よねKEN 編集日時 2007-02-16 10:04 ] | ||||||||||||
|
投稿日時: 2007-02-16 09:59
お疲れ様です。
るぱんです。 1)良くは使わないです 2)多重代入式というらしいです http://wisdom.sakura.ne.jp/programming/cs/cs5.html ここで「多重代入」を調べてみてください 通常は式の後ろ側から処理されます [追記] Javaの言語規定を調べてみます [/追記] [編集] 文言の修正 [/編集] [ メッセージ編集済み 編集者: るぱん 編集日時 2007-02-16 10:20 ] | ||||||||||||
|
投稿日時: 2007-02-16 10:54
レス早っ
なるほど。普通に使える形なのですね。 見た目すっきりしていいのかもしれませんね。
ためになります。 変数名からすると pattern2 = pattern1 = getPattern() こう書くべきですね。 一括代入 だと別の意味 (x ,y, z) = (1, 2, 3) 見たいなのを指す事があるようなので 個人的には 多重代入 と呼ぶことにします。 早い回答ありがとうございました。 | ||||||||||||
|
投稿日時: 2007-02-16 11:04
えっと・・・数が増えてくると捌き切れなくなるのでお勧めしていません。 行数を減らせって趣旨の要件が挙がってきた時には考えますが、 基本的には使わない方が良いです。 大規模になってくると、 この構文の意味を理解できる人と出来ない人とばらつきが出るので お勧めしません。 個人開発においては任意だと思います。 中規模でも辛いかな? 少数精鋭でプロジェクト組むときは何でもありになりますが(笑) (プロジェクトメンバーの教育のコストも考えての話です。)
初期化などで見受けられます。 Javaが参照渡しなのを考えれば、どちらでも構わないと思います。 ただ、プリミティブは値渡しになるので注意が必要です。 軽い混乱を引き起こすメンバーも居るかもしれません。
(x ,y, z) = (1, 2, 3)も多重代入と言ったと記憶します。 「;」で区切った一行だが、一度に複数の命令をこなす代入全体を 多重代入と言ったと記憶しています。 Javaの言語仕様は調べてるんですが、記述が・・・汗 subsutituteで検索なのかなぁ・・・? J2SE6が出てるんで、J2SE 1.4.2相当の言語仕様自体が見当たらない。。。(涙) | ||||||||||||
|
投稿日時: 2007-02-16 11:12
普通は単純な値型の初期化にしかつかわん。
i1 = i2 = 0; i1 = i2 = getUnko(); こんなんだと帰ってくる値を気にしなきゃいけない。 | ||||||||||||
|
投稿日時: 2007-02-16 11:55
> 普通は単純な値型の初期化にしかつかわん。
確かに x = y = 0; とか単純なものにしか使わないですね。 (といっても私の場合、こういう記述をできない言語を主に使っているので、 どちらにしても使う機会がないのですが) >J2SE6が出てるんで、J2SE 1.4.2相当の言語仕様自体が見当たらない。。。(涙) 少々古いかもしれませんが、本題の件くらいの内容は含んでいそうです。 http://www.y-adagio.com/public/standards/tr_javalang/index.htm が、ここでは今回の代入方法について特に命名されていませんね。 「19.12 式(15)からの生成規則 」に以下のように載っているのみのように思います。 #斜め読みしているだけなので、見落としはあるかもしれません。
|