2 == true が false で驚いた件
Twitter 経由、
この辺はC/C++も難しくて 本質的には 2==trueも本当は真なんですが偽になったりもします。
Rubyではif(0)はtrueルート なのかっ Cと逆だな | レビログ(改装中)
えっと・・・何を言っているのかよく分からない・・・
で、上のエントリに言及している ssc RiSK さん(id:RiSK) のエントリ中で、
#include<iostream> int main(){ std::cout<<( 2==true)<<std::endl; bool two=2;std::cout<<(two==true)<<std::endl; }bool, true and false. - 危ないRiSKのブログ
の結果 (0, 1) に驚いたという話。よく考えると何もおかしなことはないのだけど・・・
2 == true が false になる話
bool と int では bool の方が小さいのだから、比較時に int に変換されるというのは自然な気がする。
- true が int に変換されて 1になる
- 2 == 1 はもちろん false、つまり 0
two == true が true になる話
これは、逆に int が bool に変換されるので、2 だろうがなんだろうが、非 0 は true になるから自然な気がする。
- bool two = 2; で 2 は非 0 なので two は true に設定される
- true == true はもちろん true、つまり 1
どっちも単体では自然な気はするんだけど・・・並べて書くと、変換される項が違うということに気付きにくいのかな。
あ、規格とかは今回当たってないです。
それにしても、大元の「本質的には 2==trueも本当は真なんですが偽になったりもします」というのはよくわからない・・・
「2 == true になって欲しいのですが、このままでは偽になってしまいます」ということ?
以下適当に。
std::cout.setf(std::ios::boolalpha); bool two = 2; std::cout << (2 == true) << std::endl; // => false std::cout << (two == true) << std::endl; // => true std::cout << (bool(2) == true) << std::endl; // => true std::cout << (static_cast<bool>(2) == true) << std::endl; // => true