R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

比較と代入の演算子

var i = 1;
var j = 0;
Console.WriteLine((j = i) == i);


こーゆー風には書けるんですねー
でも、仕事で書いたら

殴られそうです

ちなみに、結果は True になります。

さて、ここで問題です。
比較演算子の左辺は、i と j どちらの値と比較しているのでしょう?

#誰か教えて下さい

投稿日時 : 2009年4月20日 13:14

Feedback

# re: 比較と代入の演算子 2009/04/20 13:22 囚人

>比較演算子の左辺は、i と j どちらの値と比較しているのでしょう?

i を j に代入した結果だから、iともjとも言える。

# re: 比較と代入の演算子 2009/04/20 13:22 中 博俊

j

# re: 比較と代入の演算子 2009/04/20 13:26 よねけん

動かしてませんが、
iをjに代入した結果(つまりiの値であり、新しいjの値)とiを比較してますね。

例のコードそのままなら、殴られそうかもしれませんが、
以下のようなパターンはよく使いませんか?
(lineはstring、srはStreamReaderの変数)

while ((line = sr.ReadLine())!=null)
{
Console.WriteLine(line);
}

C#の代入が代入文でなく、代入式であるメリットが
活かせる事例だと思います。

# re: 比較と代入の演算子 2009/04/20 14:00 アキラ

jでしょう。

# re: 比較と代入の演算子 2009/04/20 14:12 aetos

殴ります。

# re: 比較と代入の演算子 2009/04/20 14:19 青柳 臣一

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 です。(当然ですけど)

# re: 比較と代入の演算子 2009/04/20 14:31 おぎわら

良スレのヨカン

# re: 比較と代入の演算子 2009/04/20 15:06 あんどちん

マジレスするとjだと思うけど、それじゃつまらないし。

この場合条件は常に真になるわけだからコンパイラの最適化で比較演算は無くなり結果のTrueのみがコード化されるんじゃないでしょうかw
# 最適化offならjとの比較になるかな?

# re: 比較と代入の演算子 2009/04/20 15:13 774RR

var i=0;
var j=1.0;
Console.WriteLine((j=i)==i);
とかだと少し面白くなる悪寒
# って VB ぜんぜん知らないんだけどこれでおk?>識者

# 比較と代入の演算子 2009/04/20 15:13 えムナウ Blog

比較と代入の演算子

# re: 比較と代入の演算子 2009/04/20 15:53 あんどちん

> # って VB ぜんぜん知らないんだけどこれでおk?>識者
そもそもC#です
VBだと行末に";"付きません

# 【VB Love】比較と代入……、イジめんなエロい人^^; 2009/04/20 16:30 PCだいちゅき

【VB Love】比較と代入……、イジめんなエロい人^^;

# 【VB Love】比較と代入……、イジめんなエロい人^^; 2009/04/20 16:31 PCだいちゅき

【VB Love】比較と代入……、イジめんなエロい人^^;

# re: 比較と代入の演算子 2009/04/20 16:56 biac

青柳さんの実験が面白い。
ちょっと改竄 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

# re: 比較と代入の演算子 2009/04/20 17:15 biac

こうすれば、 もっと明瞭かな?
クラス 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);
}

# re: 比較と代入の演算子 2009/04/20 17:16 刈歩 菜良 CTP

あれ~~~?
でも、私は答えが違う。
i
です。

=代入演算子は代入してその代入した値を戻り値として返すという認識です。
なので、
i

# re: 比較と代入の演算子 2009/04/20 17:18 刈歩 菜良 CTP

あ、補足。
厳密に言うと昔のiです。
(j=i)の戻り値とiを比較しているので、正解はjでもiでもない。
でも、どちらかというとiという感覚かなぁ。

# re: 比較と代入の演算子 2009/04/20 17:27 青柳 臣一

> biacさん
私が書いたように単純代入式の結果は 「代入される値」 なんです。
biacさんの例だと xj.A のセッターを呼ぶために xi.A のゲッターを呼び出して (必要なら暗黙のキャストなどをして) 値を準備するわけですが、この値こそが代入式の結果となります。
Rさんの例で言うと 「i から取り出した 1 という値」 が代入式の結果です。厳密には i でも j でも無いということになるんじゃないかと思います。
たとえば、j が double だった場合は暗黙のキャストによって 1.0 が作られ、これが代入式の結果になります。

# re: 比較と代入の演算子 2009/04/20 17:28 えムナウ

>厳密に言うと昔のiです。
意味わかんねぇ。
せっかく正解っぽかったのに。

# re: 比較と代入の演算子 2009/04/20 20:29 刈歩 菜良 CTP

> >厳密に言うと昔のiです。
> 意味わかんねぇ。
> せっかく正解っぽかったのに。

(>_<)

あぁ、ですよね。
例えば、
(j=i++)==i
とか書かれちゃうと、iの値って変わるじゃないですか。
なので、「昔の」ってのは「評価前の」もしくは「代入時の」って意味です。

すんまそん。
<(_ _)>

# C#の演算子の優先順位と結合規則と代入の仕組みとオカンとボクと、時々、オトン 2009/04/20 23:12 むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

C#の演算子の優先順位と結合規則と代入の仕組みとオカンとボクと、時々、オトン

# C#の演算子の優先順位と結合規則と代入の仕組みとオカンとボクと、時々、オトン 2009/04/20 23:24 むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

C#の演算子の優先順位と結合規則と代入の仕組みとオカンとボクと、時々、オトン

# re: 比較と代入の演算子 2009/04/21 11:40 n

c++的に考えると j.operator=(i) となって自分への参照(*this)を返すから j かと思ったけど・・・

# re: 比較と代入の演算子 2009/04/21 13:24 R・田中一郎

i が正解ってことですね。
しかし厳密にいうと、i に代入した 1 になると。

いやー、たった 3 行のコードで、皆で集まって、あーでもないこーでもないと、わいわい話ができるのって楽しいですね。

# re: 比較と代入の演算子 2009/04/21 16:18 774RR

i に代入などしていないと思うの心
j の値(厳密には j に代入したところの値)っすね

# re: 比較と代入の演算子 2009/04/22 14:01 R・田中一郎

ん?
何や混乱してきた・・・

# oGUOpiuzzWWLrGbguf 2011/12/16 2:07 http://www.healthinter.org/health/page/actonel.php

Thanks for the news! Just was thinking about it! By the way Happy New Year to all of you:D

# Illikebuisse tgydf 2021/07/03 1:40 pharmaceptica

who chloroquine https://pharmaceptica.com/

# jfsMqXyslzJxDmG 2021/07/03 4:40 https://www.blogger.com/profile/060647091882378654

Real clean web site, appreciate it for this post.

# re: ????????? 2021/07/09 22:07 hydroxychloroquine safe

cloriquin https://chloroquineorigin.com/# hydrocholorquine

# erectile device 2021/07/12 3:33 is hydroxychloroquine safe

what is hydroxychloroquine https://plaquenilx.com/# risks of hydroxychloroquine

# ajqtelrwiyjd 2021/11/30 15:12 dwedayxrnz

https://chloroquinestablet.com/

# where to buy chloroquine tablets 2022/12/30 13:53 MorrisReaks

200 mg hydroxychloroquine http://www.hydroxychloroquinex.com/#

# doors2.txt;1 2023/03/14 14:45 jCzjrtvolXC

doors2.txt;1

タイトル
名前
Url
コメント