- - PR -
1行に代入文2個 これは何?
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-16 12:04
今回の例と違う使い方ですが、
代入式自体が代入された値を返すことを利用して
という書き方をすることは比較的見かける気がします。 ループでは代入を行いたいが条件判断も行いたいというケースが出てきますので。 実際にやることは少ないでしょうが、やれるという意味では
といったトリッキーなこともできるわけですが、 当然ながらやらないほうがいいでしょうね。 | ||||||||||||||||
|
投稿日時: 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
_________________ 『Life's rich Tapestry!!』 | ||||||||||||||||
|
投稿日時: 2007-02-27 11:10
objectです。
の手続き的意味は、確かに
だと思います。 しかし
の心は、 「pattern1 = pattern2」 つまり、 「代入」という意味より「等しい」という意味であり、 そしてその値が「getPattern()」である という事の言明になっていると考える事が大切ではないでしょうか? C系の言語が手続き的であるのは、 CPUが持つ機能群と同型であろうとする為の手段である と言っても良いのではないでしょうか? #Cの「goto」も、このレベルで考える必要があるものだと私は思っています。 或る意味で、 「文」以前に「式」を考える発想は、 手続き思考を超えたもの だと思います。 そして 「C」はそういう考え方を「ジンワリ」と深い所から教えてくれる言語である と私は思っています。 | ||||||||||||||||
|
投稿日時: 2007-02-27 12:04
C言語における「=」は「等しい」ではなく「代入」です。 等号は「==」で明確に区別されています。 それを別の思想である数学の「=」の等号の意図にひきずられて 「等しい」という概念を持つのだ、そこが大切なのだ、という 主張は認めることができません。 行列の積は可換ではありませんが、単位行列との積 AI = A を見て四則演算での積のように見えることに注目して 「これは「行列の積」という意味より「代数の可換な積」の意味であり、 そしてその値がAである という事の言明になっていると考える事が大切ではないでしょうか?」 と主張するようなものだと思います。(たとえがイマイチですが…) 別系統の記号の使い方(C言語と代数)と見た目の類似しているからといって 代数の意味で表現されているのだ! と捕らえるのは数学的ではないでしょう。 そして、そういった混同こそがバグを生むのでやってはならないことでしょう。 | ||||||||||||||||
|
投稿日時: 2007-02-27 12:14
なんでそんなに数学っていうか算数が好きなの?こだわり? | ||||||||||||||||
|
投稿日時: 2007-02-28 12:22
objectです。
>nagiseさん >C言語における「=」は「等しい」ではなく「代入」です。 >等号は「==」で明確に区別されています。 「=」は、その意味の範囲内に於いて、 実行結果として両者(代入するものされるもの)が等しくなります。 #従って、「=」と「==」は表裏一体の関係があります。 もし、nagiseさんが 私の前回の記述内容を 「=」と「==」とが全く同じものであるとする主張 と解釈されたのであれば、これ以上の議論は不要でしょう。 >ぶさいくろうさん >なんでそんなに数学っていうか算数が好きなの?こだわり? 私は、 私の「好き嫌い」或いは「こだわり」 から発言している訳ではありません。 「正しさを重要視し、尚且つ、多様な概念を扱おう」 とすると、それは 「数学になる」 というだけの話です。 | ||||||||||||||||
|
投稿日時: 2007-02-28 13:27
も、「数学的」に左辺と右辺が同じってことですか? どう考えても、代入でしょう。 #某所のK氏のコメントを参考にしました。 | ||||||||||||||||
|
投稿日時: 2007-02-28 13:32
残念ながら表裏一体とはなりません。 例を挙げましょう。
1に関して、実行結果として両者(代入するものされるもの)が等しくなりません。 これは、C言語における記号の体系を数学のそれと混同せずに正しく理解していれば なんら不思議なことはありませんが、数学の記号しかしらない初心者に見せると まず混乱する事例のひとつです。 数学の式においては時間の概念はないでしょうから、常に成り立つ必要があります。 ですから、自己言及に陥る場合、式は成り立たなくなります。 C言語における式は計算を簡易に表せるようにしたシンタックスシュガーですので 実際には算術命令の並びと考えられます。 COBOLなどの古い言語では数式に似せた記述ではなく、明確に加算などの 命令を用いて計算していたわけです。 その簡易表記という側面はいまでも健在ですから、 hoge = hoge +1はhogeとhoge +1が等しいわけでもなんでもなく、 hoge +1をhogeに代入するだけの意味です。 また、2の例に挙げたようにC言語で明確に区別される=と==ですが、 この==ですら、数学の等式とは意味がことなります。 あくまで「左辺と右辺が等しいかを評価する」機能です。 数学のように恒等式となるわけではありません。 これらのことからもわかるように、C言語の記号体系は数学のそれに 似せてはありますが、本質的に別物なのです。 似ているからといって意味を混同するのはナンセンスです。
私も「正しさ」に対するこだわりがあります。 そして、それが「工学になる」というだけの話です。 数学にこだわられるのであれば、 pattern1 = pattern2 = getPattern(); の例において もし、これが数学的な等号をあらわすのであれば、可換であるから pattern1 = getPattern() = pattern2; とすることが可能となる。 しかし、これはコンパイルエラーとなるから背理法により 数学的な等号として扱えないことがわかる Q.E.D. とでもすればよかったでしょうか? もし、数学的にその等しさをもつとおっしゃるのであれば、 その論理形態を示してもらいたい。そう、お得意の数学で。 そして出てくる無矛盾な公理系こそがプログラム言語そのものであり、 数学の代数などでみられるそれをは別物であることを理解してほしい。 チューリング博士が示した道は数学ですよ。 プログラムのアルゴリズムや言語体系は数学に基づいている。 でも、それを独自のトンデモ理論で破壊しないでもらいたいものです。 |