R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

三項演算子は上から評価される(その3)

http://blogs.wankuma.com/rti/archive/2008/09/03/155325.aspx
三項演算子は上から評価される(その2)

http://blogs.wankuma.com/rti/archive/2008/09/02/155189.aspx
三項演算子は上から評価される

・・・の続きになるのかな?

http://d.hatena.ne.jp/uskz/20080903/p6
(梶本裕介の日記)

を読んで、面白いな~、と思いました。
確かにプログラマが、どちらの意図で条件演算子を記述したのかを判断する術はないのかもしれませんね。

C# の場合を考えてみると、PHP のような曖昧な記述は問題にはならないように思います。
何故なら、C# の比較演算結果は常に bool 値になる必要があるため、どちらの意図であると解釈されても同じ結果になるからです。

Console.WriteLine(true ? false : true ? true : false);

結果が false と表示されます。
この式は、記述者の意図の解釈として、以下の 2 通りが考えられます。

true ? false : (true ? true : false): // false
(true ? false : true) ? true : false: // false

どちらも、結果は false になります。

true ? false : true ? false : true;
true ? false : (true ? false : true); // false
(true ? false : true) ? false : true; // false

false ? false : false ? false : true;
false ? false : (false ? false : true); // true
(false ? false : false) ? false : true); // true

false ? false : true ? false : true;
false ? false : (true ? false : ture); // false
(false ? false : true) ? false : true; // false

どう書いても 2 通りの意図は同じ結果になります。(間違ってない?ドキドキ)
なお、複数の条件演算子を並べてみても、要するに上記の 2 つの条件演算子の組み合わせを冗長化しているにすぎないと思うので、3 つ重なった場合を考える必要はないでしょうね。

#論破されそうだな~w

投稿日時 : 2008年9月4日 10:16

Feedback

# re: 三項演算子は上から評価される(その3) 2008/09/04 10:50 NyaRuRu

>型セーフな言語である C#

一度 Virtual Execution System と C# の type-safe の意味論を調べてみた方が良いかも。

# re: 三項演算子は上から評価される(その3) 2008/09/04 11:02 NyaRuRu

Func<bool, int, bool> f = (cond, i) => Console.WriteLine(i) is object ? cond : cond;

Console.WriteLine(f(true, 1) ? f(false, 2) : (f(true, 3) ? f(true, 4) : f(false, 5)));
Console.WriteLine();
Console.WriteLine((f(true, 1) ? f(false, 2) : f(true, 3)) ? f(true, 4) : f(false, 5));

# re: 三項演算子は上から評価される(その3) 2008/09/04 11:56 R・田中一郎

比較演算結果が bool 型に変換できないとダメいう点で、型セーフという表現をしたのですが、根本的に解釈が間違っているかな?^^;

しかし、下のコードの実行結果が違っているのは意外ですね。
次回のネタで検証しようと思っていたのですがw

# re: 三項演算子は上から評価される(その3) 2008/09/04 11:58 R・田中一郎

あー、考えてみれば当り前かー^^;
頭の中がぐちゃぐちゃになってるw

# re: 三項演算子は上から評価される(その3) 2008/09/04 12:18 まじかんと

型セーフのことを持ち出すなら、
true ? 1 : false ? 2 : 3;
を左結合で
(true ? 1 : false) ? 2 : 3;
と解釈すると 1 と false の型が違うのでエラーになる、という話をするのが普通だと思います。

# re: 三項演算子は上から評価される(その3) 2008/09/04 12:39 Jitta

> この式は、記述者の意図の解釈として、以下の 2 通りが考えられます。

なんで?言語仕様にしたがって記述した、と解釈するのが自然かと思います。
記述者の意図通りに解釈されるのなら、バグなんて発生しないと思います。

# re: 三項演算子は上から評価される(その3) 2008/09/04 13:02 774RR

コンパイラは言語仕様どおりに解釈し、記述者の意図など斟酌しないわけで、
記述者の意図が言語仕様と異なるなら意図どおりに動かないだけ。

リンク先の主張は単に PHP の言語仕様が他と違うというだけのこと

# re: 三項演算子は上から評価される(その3) 2008/09/04 13:16 R・田中一郎

原文の表現を変えてみました。

趣旨としては、比較演算結果がbool型でなければならない前提において、PHP のように記述者の意図が 2 通りの解釈になることはない、という話です。

タイトル
名前
Url
コメント