いつもお世話になっております。
環境
OS;XP、VC++.NET 2003 フォームアプリケーション(.NET)
S"0"をbool型(true)に変換したいのですが、なにか方法はないでしょうか。
宜しくお願いします。
どのような変換基準ですか?
S"false" なら false、それ以外は true になるとか、
空文字列なら false、それ以外は true になるとか…
S"0" が true で、その他の文字列はどうなるんですか?
厳密に一般化された変換規則が無いと、答えられないと思います。
お返事ありがとうございます。
S"0"をbool型(true) ← 間違ってました。bool型(false)でした。
>厳密に一般化された変換規則が無いと、答えられないと思います。
確かにそうですね、一般化された変換規則として
true ⇒ 1
false ⇒ 0
と思っていたので、そうであるならば、S"0"をキャストしてbool型(false)にできないかと思ってお聞きしました。
#ちょっとしつこく書いてみます
> 確かにそうですね、一般化された変換規則として
「一般化」と「一般的」は違いますのでご注意を。
「一般的には〜」は「普通は〜」と同義ですが、「一般化」とは、その規則がどのような場合にも通用するようにすることです。
"0" は false、"1" は true。
では "2" は? "3" は? "う゛ぃしぃぷらぷら" は? となってしまいます。
これは変換規則が "0" と "1" の場合にしか通用していないので、「一般化されていない」状態です。
大抵、プログラミングにおいて真偽を決めるときは、あるものを「偽」と決め、それ以外を全て「真」とします。
C++ では 0 が偽なので、それ以外… 1 も 2 も 3 も 8641 も -4 も、すべて真です。
ですから今回は "0" が false、それ以外が true ということになるのでしょうか。
もちろん、"0" が false、"1" が true、それ以外は変換不能として例外で落とす、という設計も可能です。
これなら、あらゆる値に対応できる変換規則になったので「一般化された」状態です。
で、本題ですが。
String::Equals で比較するだけですね。
まず "0" と比較し、同じだったら false に確定。
その後で、それ以外の全てを true とみなすか、さらに S"1" と比較して…を行うかは設計次第ということで。
丁寧な解説どうもありがとうございました。
ツイート | ![]() |