主にC# な話題です
var i = 1;var j = 0;Console.WriteLine((j = i) == i);
こーゆー風には書けるんですねーでも、仕事で書いたら
殴られそうです
ちなみに、結果は True になります。
さて、ここで問題です。比較演算子の左辺は、i と j どちらの値と比較しているのでしょう?
#誰か教えて下さい
投稿日時 : 2009年4月20日 13:14
>比較演算子の左辺は、i と j どちらの値と比較しているのでしょう? i を j に代入した結果だから、iともjとも言える。
j
動かしてませんが、 iをjに代入した結果(つまりiの値であり、新しいjの値)とiを比較してますね。 例のコードそのままなら、殴られそうかもしれませんが、 以下のようなパターンはよく使いませんか? (lineはstring、srはStreamReaderの変数) while ((line = sr.ReadLine())!=null) { Console.WriteLine(line); } C#の代入が代入文でなく、代入式であるメリットが 活かせる事例だと思います。
jでしょう。
殴ります。
C# 言語仕様 「7.16.1 単純代入」によると単純代入式の結果は代入される値ということですから、この場合は 「1という値」 ということになるかと思います。 まぁ、今回の場合は i も j も Int32 なので i と言っても j と言ってもいいような気はしますが。 ただ、j がもっと複雑だと 「j のセッターを呼び出したときの値」 と 「j の値」 とでは意味が違ってくる場合があります。 以下みたいな例もおもしろいかもしれません。 class X { private int a; public int A { get { return 0; } // 常にゼロを返す set { this.a = value; } } } こんなのがあったときに var x0 = new X(); var x1 = nwe X(); x0.A = x1.A = 1; ↑これだと x0.a も x1.a も 1 です。 しかし、 x1.A = 1; x0.A = x1.A; だと x0.a は 0 です。(当然ですけど)
良スレのヨカン
マジレスするとjだと思うけど、それじゃつまらないし。 この場合条件は常に真になるわけだからコンパイラの最適化で比較演算は無くなり結果のTrueのみがコード化されるんじゃないでしょうかw # 最適化offならjとの比較になるかな?
var i=0; var j=1.0; Console.WriteLine((j=i)==i); とかだと少し面白くなる悪寒 # って VB ぜんぜん知らないんだけどこれでおk?>識者
比較と代入の演算子
> # って VB ぜんぜん知らないんだけどこれでおk?>識者 そもそもC#です VBだと行末に";"付きません
【VB Love】比較と代入……、イジめんなエロい人^^;
青柳さんの実験が面白い。 ちょっと改竄 f(^^; class X { private int a; public int A { get { return this.a - 1; } // 1少なく返す set { this.a = value; } } } [TestMethod] public void TestMethod2() { var xi = new X() { A = 1 }; var xj = new X() { A = 0 }; Console.WriteLine((xj.A = xi.A) == xi.A); Console.WriteLine("xi.A={0}", xi.A); Console.WriteLine("xj.A={0}", xj.A); } xi.A を読み出すと 0、 それを xj.A に代入してるから xj の a は 0、 すると xj.A を読み出すと -1。 -1 と、 xi.A を読みだした 0 とを比較するから、 False ? …はい、 実行結果どぞ。 f(^^; True xi.A=0 xj.A=-1 # くちょ。 False になると思ったのに~ orz
こうすれば、 もっと明瞭かな? クラス X の B プロパティは、 代入はできるけど読み出しは出来ない変態さん。 f(^^; class X { private int a; public int A{ get { return this.a - 1; } set { this.a = value; } } private int b; public int B { set { this.b = value; } } } public void TestMethod3() { Console.WriteLine((xj.B = xi.A) == xi.A); }
あれ~~~? でも、私は答えが違う。 i です。 =代入演算子は代入してその代入した値を戻り値として返すという認識です。 なので、 i
あ、補足。 厳密に言うと昔のiです。 (j=i)の戻り値とiを比較しているので、正解はjでもiでもない。 でも、どちらかというとiという感覚かなぁ。
> biacさん 私が書いたように単純代入式の結果は 「代入される値」 なんです。 biacさんの例だと xj.A のセッターを呼ぶために xi.A のゲッターを呼び出して (必要なら暗黙のキャストなどをして) 値を準備するわけですが、この値こそが代入式の結果となります。 Rさんの例で言うと 「i から取り出した 1 という値」 が代入式の結果です。厳密には i でも j でも無いということになるんじゃないかと思います。 たとえば、j が double だった場合は暗黙のキャストによって 1.0 が作られ、これが代入式の結果になります。
>厳密に言うと昔のiです。 意味わかんねぇ。 せっかく正解っぽかったのに。
> >厳密に言うと昔のiです。 > 意味わかんねぇ。 > せっかく正解っぽかったのに。 (>_<) あぁ、ですよね。 例えば、 (j=i++)==i とか書かれちゃうと、iの値って変わるじゃないですか。 なので、「昔の」ってのは「評価前の」もしくは「代入時の」って意味です。 すんまそん。 <(_ _)>
C#の演算子の優先順位と結合規則と代入の仕組みとオカンとボクと、時々、オトン
c++的に考えると j.operator=(i) となって自分への参照(*this)を返すから j かと思ったけど・・・
i が正解ってことですね。 しかし厳密にいうと、i に代入した 1 になると。 いやー、たった 3 行のコードで、皆で集まって、あーでもないこーでもないと、わいわい話ができるのって楽しいですね。
i に代入などしていないと思うの心 j の値(厳密には j に代入したところの値)っすね
ん? 何や混乱してきた・・・
Thanks for the news! Just was thinking about it! By the way Happy New Year to all of you:D
who chloroquine https://pharmaceptica.com/
Real clean web site, appreciate it for this post.
cloriquin https://chloroquineorigin.com/# hydrocholorquine
what is hydroxychloroquine https://plaquenilx.com/# risks of hydroxychloroquine
https://chloroquinestablet.com/
200 mg hydroxychloroquine http://www.hydroxychloroquinex.com/#
doors2.txt;1
Powered by: Copyright © R・田中一郎