- PR -

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

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-16 12:04
今回の例と違う使い方ですが、
代入式自体が代入された値を返すことを利用して
コード:
while ((length = inputStream.read(bytes)) != -1) {
    ...
}


という書き方をすることは比較的見かける気がします。
ループでは代入を行いたいが条件判断も行いたいというケースが出てきますので。

実際にやることは少ないでしょうが、やれるという意味では
コード:
// メソッドの引数に渡す際に代入
hogeMethod(a = 3);
// return値を返す際にインスタンスメソッドに代入
return this.hoge = 5;


といったトリッキーなこともできるわけですが、
当然ながらやらないほうがいいでしょうね。
こくぼ
大ベテラン
会議室デビュー日: 2003/08/11
投稿数: 229
お住まい・勤務地: 国境の南、太陽の西。
投稿日時: 2007-02-26 16:14
Java以外の言語、例えばRubyでいうと、こんな書き方ができます。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%B1%E9%BB%BB%BB%D2%BC%B0#a.c2.bf.bd.c5.c2.e5.c6.fe
コード:
foo, bar, baz = 1, 2, 3



_________________
『Life's rich Tapestry!!』
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-02-27 11:10
objectです。

コード:

Pattern pattern1;
Pattern pattern2;
pattern1 = pattern2 = getPattern();


の手続き的意味は、確かに
コード:

Pattern pattern1;
Pattern pattern2;
pattern2 = getPattern();
pattern1 = pattern2;


だと思います。
しかし
コード:

pattern1 = pattern2 = getPattern();


の心は、
「pattern1 = pattern2」
つまり、
「代入」という意味より「等しい」という意味であり、
そしてその値が「getPattern()」である
という事の言明になっていると考える事が大切ではないでしょうか?

C系の言語が手続き的であるのは、
CPUが持つ機能群と同型であろうとする為の手段である
と言っても良いのではないでしょうか?
#Cの「goto」も、このレベルで考える必要があるものだと私は思っています。

或る意味で、
「文」以前に「式」を考える発想は、
手続き思考を超えたもの
だと思います。
そして
「C」はそういう考え方を「ジンワリ」と深い所から教えてくれる言語である
と私は思っています。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-27 12:04
引用:

objectさんの書き込み (2007-02-27 11:10) より:
pattern1 = pattern2 = getPattern();[/code]
の心は、
「pattern1 = pattern2」
つまり、
「代入」という意味より「等しい」という意味であり、
そしてその値が「getPattern()」である
という事の言明になっていると考える事が大切ではないでしょうか?



C言語における「=」は「等しい」ではなく「代入」です。
等号は「==」で明確に区別されています。

それを別の思想である数学の「=」の等号の意図にひきずられて
「等しい」という概念を持つのだ、そこが大切なのだ、という
主張は認めることができません。

行列の積は可換ではありませんが、単位行列との積
AI = A
を見て四則演算での積のように見えることに注目して
「これは「行列の積」という意味より「代数の可換な積」の意味であり、
 そしてその値がAである
 という事の言明になっていると考える事が大切ではないでしょうか?」
と主張するようなものだと思います。(たとえがイマイチですが…)
別系統の記号の使い方(C言語と代数)と見た目の類似しているからといって
代数の意味で表現されているのだ!
と捕らえるのは数学的ではないでしょう。
そして、そういった混同こそがバグを生むのでやってはならないことでしょう。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-27 12:14
引用:

objectさんの書き込み (2007-02-27 11:10) より:
objectです。

コード:

Pattern pattern1;
Pattern pattern2;
pattern1 = pattern2 = getPattern();


の手続き的意味は、確かに
コード:

Pattern pattern1;
Pattern pattern2;
pattern2 = getPattern();
pattern1 = pattern2;


だと思います。
しかし
コード:

pattern1 = pattern2 = getPattern();


の心は、
「pattern1 = pattern2」
つまり、
「代入」という意味より「等しい」という意味であり、
そしてその値が「getPattern()」である
という事の言明になっていると考える事が大切ではないでしょうか?

C系の言語が手続き的であるのは、
CPUが持つ機能群と同型であろうとする為の手段である
と言っても良いのではないでしょうか?
#Cの「goto」も、このレベルで考える必要があるものだと私は思っています。

或る意味で、
「文」以前に「式」を考える発想は、
手続き思考を超えたもの
だと思います。
そして
「C」はそういう考え方を「ジンワリ」と深い所から教えてくれる言語である
と私は思っています。


なんでそんなに数学っていうか算数が好きなの?こだわり?
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-02-28 12:22
objectです。

>nagiseさん
>C言語における「=」は「等しい」ではなく「代入」です。
>等号は「==」で明確に区別されています。
「=」は、その意味の範囲内に於いて、
実行結果として両者(代入するものされるもの)が等しくなります。
#従って、「=」と「==」は表裏一体の関係があります。

もし、nagiseさんが
私の前回の記述内容を
「=」と「==」とが全く同じものであるとする主張
と解釈されたのであれば、これ以上の議論は不要でしょう。

>ぶさいくろうさん
>なんでそんなに数学っていうか算数が好きなの?こだわり?
私は、
私の「好き嫌い」或いは「こだわり」
から発言している訳ではありません。

「正しさを重要視し、尚且つ、多様な概念を扱おう」
とすると、それは
「数学になる」
というだけの話です。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-02-28 13:27
引用:

>nagiseさん
>C言語における「=」は「等しい」ではなく「代入」です。
>等号は「==」で明確に区別されています。
「=」は、その意味の範囲内に於いて、
実行結果として両者(代入するものされるもの)が等しくなります。
#従って、「=」と「==」は表裏一体の関係があります。


コード:
i = i + 1;


も、「数学的」に左辺と右辺が同じってことですか?
どう考えても、代入でしょう。

#某所のK氏のコメントを参考にしました。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-28 13:32
引用:

objectさんの書き込み (2007-02-28 12:22) より:
>nagiseさん
>C言語における「=」は「等しい」ではなく「代入」です。
>等号は「==」で明確に区別されています。
「=」は、その意味の範囲内に於いて、
実行結果として両者(代入するものされるもの)が等しくなります。
#従って、「=」と「==」は表裏一体の関係があります。



残念ながら表裏一体とはなりません。
例を挙げましょう。

コード:
// 1.右辺に左辺と同様の変数が現れる場合
hoge = hoge +1;

// 2.==が用いられるが等しくはない場合
hoge = 3;
if (hoge == 5) {
  ...
}



1に関して、実行結果として両者(代入するものされるもの)が等しくなりません。
これは、C言語における記号の体系を数学のそれと混同せずに正しく理解していれば
なんら不思議なことはありませんが、数学の記号しかしらない初心者に見せると
まず混乱する事例のひとつです。

数学の式においては時間の概念はないでしょうから、常に成り立つ必要があります。
ですから、自己言及に陥る場合、式は成り立たなくなります。
C言語における式は計算を簡易に表せるようにしたシンタックスシュガーですので
実際には算術命令の並びと考えられます。
COBOLなどの古い言語では数式に似せた記述ではなく、明確に加算などの
命令を用いて計算していたわけです。
その簡易表記という側面はいまでも健在ですから、
hoge = hoge +1はhogeとhoge +1が等しいわけでもなんでもなく、
hoge +1をhogeに代入するだけの意味です。

また、2の例に挙げたようにC言語で明確に区別される=と==ですが、
この==ですら、数学の等式とは意味がことなります。
あくまで「左辺と右辺が等しいかを評価する」機能です。
数学のように恒等式となるわけではありません。

これらのことからもわかるように、C言語の記号体系は数学のそれに
似せてはありますが、本質的に別物なのです。
似ているからといって意味を混同するのはナンセンスです。


引用:

objectさんの書き込み (2007-02-28 12:22) より:
「正しさを重要視し、尚且つ、多様な概念を扱おう」
とすると、それは
「数学になる」
というだけの話です。


私も「正しさ」に対するこだわりがあります。
そして、それが「工学になる」というだけの話です。

数学にこだわられるのであれば、
pattern1 = pattern2 = getPattern();
の例において

もし、これが数学的な等号をあらわすのであれば、可換であるから
pattern1 = getPattern() = pattern2;
とすることが可能となる。
しかし、これはコンパイルエラーとなるから背理法により
数学的な等号として扱えないことがわかる
Q.E.D.

とでもすればよかったでしょうか?
もし、数学的にその等しさをもつとおっしゃるのであれば、
その論理形態を示してもらいたい。そう、お得意の数学で。
そして出てくる無矛盾な公理系こそがプログラム言語そのものであり、
数学の代数などでみられるそれをは別物であることを理解してほしい。

チューリング博士が示した道は数学ですよ。
プログラムのアルゴリズムや言語体系は数学に基づいている。
でも、それを独自のトンデモ理論で破壊しないでもらいたいものです。

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