- PR -

1行に代入文2個 これは何?

投稿者投稿内容
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-02-16 09:31
こんにちは。お世話になっております。

現在、昔の方が実装したソース(JDK1.4)の整理を行っています。
そのときに見慣れない、というか私が使ったことがないだけですが
ロジックを見つけました。
コード:
Pattern pattern1;
Pattern pattern2;
pattern1 = pattern2 = getPattern();


コンパイルも通るし
デバッグしてみたところ、どうやら
true = (pattern1 == pattern2)
らしいこともわかりました。
私なら
コード:
Pattern pattern1;
Pattern pattern2;
pattern1 = getPattern();
pattern2 = pattern1;


こうしているところです。

ここで質問です。
1)
pattern1 = pattern2 = getPattern();
こういう書き方はありなのでしょうか。
良く使われるのでしょうか。

2)
この書き方、何か呼び方とかあるんでしょうか。
同時代入とか?

スレッドの趣旨とは少しずれますが
一つのナレッジになればと思い投稿いたしました。
よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-16 09:48
ありっちゃありだろうね。右から評価されるからできること。
Cとかやっていると結構見かけるんだけどなぁ。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-02-16 09:59
引用:

あすかさんの書き込み (2007-02-16 09:31) より:
1)
pattern1 = pattern2 = getPattern();
こういう書き方はありなのでしょうか。
良く使われるのでしょうか。


→こういう書き方はありなのでしょうか。

Java言語仕様で規定されている正しい文法です。
Java言語ではC/C++同様に代入は文ではなく式ですので、
このような書き方が可能です。
式は値を返すもの、文は値を返さないもので、
上記の式の意味は、

1. pattern2にgetPattern()の結果が代入される。
2. 「pattern2 = getPattern()」という代入式はその代入された値を返すので、
pattern1には「pattern2 = getPattern()」の式の値であるpattern2の値が代入される。

という意味になります。

→良く使われるのでしょうか。
同じ意味の値を一括して複数の変数に代入するのであれば優れた書き方だと思いますが、
同じ意味の値を一括して複数の変数に代入する必要のある場面は
それほど多くはないので、良く使われるとまでは言えないように思います。

また、同値であっても意味が異なるのであれば、この書き方はすべきではないでしょう。
悪例)
count = price = 0

(どちらも0で初期化したいだけだが、countとpriceはまったく別の用途に使うような場合、
無関係なものを一まとめにするのはよくない)

引用:

2)
この書き方、何か呼び方とかあるんでしょうか。
同時代入とか?



特別な呼び方は特にないように思いますが、
同時代入、一括代入などと呼ばれる方が多そうです。
(少しGoogleで検索してみた範囲では)

--
・タイプミスを修正
・るぱんさんご指摘の多重代入の方がGoogle検索では結果件数が多いですね!!
 言語仕様を考えると同時代入は正しくないし、一括代入よりも正確な言い回しのような気がしました。


[ メッセージ編集済み 編集者: よねKEN 編集日時 2007-02-16 10:04 ]
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2007-02-16 09:59
お疲れ様です。
るぱんです。


1)良くは使わないです
2)多重代入式というらしいです

http://wisdom.sakura.ne.jp/programming/cs/cs5.html

ここで「多重代入」を調べてみてください

通常は式の後ろ側から処理されます

[追記]
Javaの言語規定を調べてみます
[/追記]
[編集]
文言の修正
[/編集]

[ メッセージ編集済み 編集者: るぱん 編集日時 2007-02-16 10:20 ]
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-02-16 10:54
レス早っ

なるほど。普通に使える形なのですね。
見た目すっきりしていいのかもしれませんね。

引用:

1. pattern2にgetPattern()の結果が代入される。
2. 「pattern2 = getPattern()」という代入式はその代入された値を返すので、
pattern1には「pattern2 = getPattern()」の式の値であるpattern2の値が代入される。


引用:

また、同値であっても意味が異なるのであれば、この書き方はすべきではないでしょう。
悪例)
count = price = 0


ためになります。
変数名からすると
pattern2 = pattern1 = getPattern()
こう書くべきですね。

一括代入
だと別の意味
(x ,y, z) = (1, 2, 3)
見たいなのを指す事があるようなので
個人的には
多重代入
と呼ぶことにします。

早い回答ありがとうございました。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2007-02-16 11:04
引用:

あすかさんの書き込み (2007-02-16 10:54) より:

なるほど。普通に使える形なのですね。
見た目すっきりしていいのかもしれませんね。


えっと・・・数が増えてくると捌き切れなくなるのでお勧めしていません。
行数を減らせって趣旨の要件が挙がってきた時には考えますが、
基本的には使わない方が良いです。

大規模になってくると、
この構文の意味を理解できる人と出来ない人とばらつきが出るので
お勧めしません。

個人開発においては任意だと思います。
中規模でも辛いかな?
少数精鋭でプロジェクト組むときは何でもありになりますが(笑)
(プロジェクトメンバーの教育のコストも考えての話です。)
引用:

変数名からすると
pattern2 = pattern1 = getPattern()
こう書くべきですね。


初期化などで見受けられます。
Javaが参照渡しなのを考えれば、どちらでも構わないと思います。
ただ、プリミティブは値渡しになるので注意が必要です。
軽い混乱を引き起こすメンバーも居るかもしれません。
引用:

一括代入
だと別の意味
(x ,y, z) = (1, 2, 3)
見たいなのを指す事があるようなので
個人的には
多重代入
と呼ぶことにします。


(x ,y, z) = (1, 2, 3)も多重代入と言ったと記憶します。
「;」で区切った一行だが、一度に複数の命令をこなす代入全体を
多重代入と言ったと記憶しています。

Javaの言語仕様は調べてるんですが、記述が・・・汗
subsutituteで検索なのかなぁ・・・?

J2SE6が出てるんで、J2SE 1.4.2相当の言語仕様自体が見当たらない。。。(涙)
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-16 11:12
普通は単純な値型の初期化にしかつかわん。
i1 = i2 = 0;

i1 = i2 = getUnko();
こんなんだと帰ってくる値を気にしなきゃいけない。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 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)からの生成規則 」に以下のように載っているのみのように思います。
#斜め読みしているだけなので、見落としはあるかもしれません。

コード:
AssignmentExpression:

        ConditionalExpression
        Assignment

Assignment:

        LeftHandSide AssignmentOperator AssignmentExpression

スキルアップ/キャリアアップ(JOB@IT)