R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

ちょっとしたクイズです(その2)

http://blogs.wankuma.com/rti/archive/2009/06/15/175382.aspx
ちょっとしたクイズです

回答編として

計算式をトレース

してみました。

間違ってないかドキドキです~


i *= ~i & 2 | 1 * (++i) - -(i--) ^ i; // 最初の状態
i *= -1 & 2 | 1 * (1) - -(1) ^ 2; // 基本式と単項式評価
i *= -1 & 2 | 1 * 1 - -1 ^ 2; // 括弧を展開
i *= -1 & 2 | 1 - -1 ^ 2;  // 乗算式を評価
i *= -1 & 2 | 2 ^ 2; // 減算式を評価
i *= 2 | 2 ^ 2; // AND 演算子を評価
i *= 2 | 0; // XOR 演算子を評価
i *= 2; // OR 演算子を評価
0; // 複合代入演算子を評価


最後の、複合代入演算子によって、後の演算結果に関係なくゼロが乗算の左辺になるので、最終的にゼロが i に代入されます。

投稿日時 : 2009年6月16日 13:44

Feedback

# re: ちょっとしたクイズです(その2) 2009/06/16 15:44 えムナウ

>赤字の部分だけ見て、ゼロだと判断した人は、ちょっと注意不足ですよ~
え~、なぜ?

>最後の、複合代入演算子によって、後の演算結果に関係なくゼロが乗算の左辺になるので、最終的にゼロが i に代入されます。
こう書いてあるじゃん。

# re: ちょっとしたクイズです(その2) 2009/06/16 15:44 れい

質問です。

> 最後の、複合代入演算子によって、後の演算結果に関係なくゼロが乗算の左辺になるので、最終的にゼロが i に代入されます。

「後の演算結果に関係なくゼロが乗算の左辺になる」のなら、

> 赤字の部分だけ見て、ゼロだと判断した人は、ちょっと注意不足ですよ~

なぜ注意不足なのでしょう?

的外れな質問かもしれませんが、ちょっとよく理解できなくて。

# [C#] 式のトレース 2009/06/16 15:48 雑記 - otherwise

ちょっとしたクイズです (R.Tanaka.Ichiro’s Blog) ちょっとしたクイズです(その2) (R.Tanaka.Ichiro’s Blog) MSIL でチェックしたところ、違う結果が出ました。。。 以下、 R さんのコメントで違った点。 右辺の「 1 * 」のところは最適化で消えてしまうみたいです 評価

# re: ちょっとしたクイズです(その2) 2009/06/16 16:26 R・田中一郎

えムナウ さん
れい さん

すみません。勘違いしてましたorz

# re: ちょっとしたクイズです(その2) 2009/06/16 20:26 出水

>i *= ~i & 2 | 1 * (++i) - -(i--) ^ i; // 最初の状態
>i *= -1 & 2 | 1 * (1) - -(0) ^ i; // 基本式と単項式評価

ここ間違ってますね~

# re: ちょっとしたクイズです(その2) 2009/06/17 5:14 R・田中一郎

どこがですか?

# re: ちょっとしたクイズです(その2) 2009/06/18 2:10 長月葵

> i *= 2 | 1; // XOR 演算子を評価
> i *= 2; // OR 演算子を評価
 C#では 00000010b | 00000001b は 00000010b になるのですか?( ∵)

# re: ちょっとしたクイズです(その2) 2009/06/18 9:27 R・田中一郎

なるわけないです orz
一応、最初からトレースしなおしたものと置き換えておきました。
そしたら、出水さんの指摘の間違いも気付きました orz

#軽くめまいが・・・w

# re: ちょっとしたクイズです(その2) 2009/06/19 14:26 とっちゃん

んー??
評価順が多分間違ってると思われ。。。
一番最初は
i *= ...

i = i * ...
にするところからじゃないと、計算できないと思うんだけど?

今のコンピュータは、複合演算を遅延評価できるほど賢くはないと思いますが。。。?

# re: ちょっとしたクイズです(その2) 2009/06/21 10:03 R・田中一郎

まー実際は、そうなんでしょうね。

上記の順であることを表記している理由が以下です。

http://msdn.microsoft.com/ja-jp/library/aa691323(VS.71).aspx
7.2.1 演算子の優先順位と結合規則

上記の表記によると、複合代入演算子の評価は最後になっています。

言語の演算優先規則と、MSIL の最適化やアセンブリレベルの実行演算順序は必ずしも同じではないと思います。

この場合、基本的には言語の演算優先規則に準じたものとした前提で理解していればOKだと思った訳ですよ。

# re: ちょっとしたクイズです(その2) 2009/06/24 1:15 ひょうが

//i *= ~i & 2 | 1 * (++i) - -(i--) ^ i; // 最初の状態
//i *= -1 & 2 | 1 * (1) - -(1) ^ 2; // 基本式と単項式評価

一番最後の^2って^0じゃない?自信ないけど。

#式は左から評価されるものと思ってました
#同じ優先度は右から(++i), (i--)の順なんですねー
#知りませんでした

# re: ちょっとしたクイズです(その2) 2009/06/24 1:16 ひょうが

誤記です。左右間違えました。
以下修正↓
#式は右から評価されるものと思ってました
#同じ優先度は左から(++i), (i--)の順なんですねー
#知りませんでした

# re: ちょっとしたクイズです(その2) 2009/06/24 15:12 R・田中一郎

>一番最後の^2って^0じゃない?自信ないけど。

あー、やっぱりそうなんかな?
最初の 0 の値が適用されるってことですよね。


# UFLOKMhwAQ 2021/07/03 2:15 https://amzn.to/365xyVY

You ave made some really good points there. I checked on the net to find out more about the issue and found most individuals will go along with your views on this web site.

# jyevfmlumtiv 2022/06/04 8:00 qecawohy

https://erythromycin1m.com/# erythromycin drug class

タイトル
名前
Url
コメント