読者です 読者をやめる 読者になる 読者になる

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 に変換されるというのは自然な気がする。

  1. true が int に変換されて 1になる
  2. 2 == 1 はもちろん false、つまり 0

two == true が true になる話

これは、逆に int が bool に変換されるので、2 だろうがなんだろうが、非 0 は true になるから自然な気がする。

  1. bool two = 2; で 2 は非 0 なので two は true に設定される
  2. 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