fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、
そしてboolへのキャストが未定義だったり、また違う意味なのなら
if (foo) {
ではなく
if (foo == true) {
って書かざるをえないだろう。嫌いとか好きとかの問題ではないと思う。
class { public: operator bool() { std::cout << "xxx\n"; return true; } //*1 operator int() { std::cout << "yyy\n"; return true; } //*2 } foo;
があったときに、「if (!foo)」だったら*1が、「if (foo == false)」だったら*2が実行されるような処理系がある。
最新のVC++だと後者は曖昧だってエラー出るね(たぶんC++だと「trueは1でfalseは0」なんかではなくあくまでもtrueとfalseなんだ)。
なんにせよ演算子や条件式などに関連する暗黙のキャストはわかりづらく、そしてそんなのを利用したコードはきっとバグる。
だから
というのが本当なら、==trueがどうこうなんて些細な問題はおいておいて、fooを暗黙のうちにintにキャストしたりboolにキャストしたりして使っているという危険な部分をまずなんとかすべきだろう。
古いC言語風に書けばこんな感じ。
#define FALSE 0 #define TRUE (!FALSE)確かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。
VC6とか関係なくてC言語の仕様でそうなんだが、それをわかってないとすればやばい。
個人的には
if( foo != FALSE ){
も十分きもちわるいので
if (foo) { ... } if (!foo) { ... }
にしてほしい。
まぁ、タイトルの「レガシープログラマ」とは私の事なんですけどね。 最近(?)外注や自社の若いのが作ってくるプログラムに if( foo == TRUE ){ という判定文をよく見かける(fooはい...
C++言語 fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、 そしてboolへのキャストが未定義だったり、また違う意味なのなら if (foo) { ではな...
不明確な条件文になっちゃうって話だよね。主張には同意。 あと、私としては冗長な書き方をさけるという意味で、 if( foo ){ がスッキリするから好きだな。 if( foo == TRUE ){ とい...
私、Windows屋だが、比較演算子を必ず使うように取り決めている。 if ( a.isFoo() != FALSE ){ // "真"のときの処理}if ( b.isFoo() == FALSE ){ // "偽"のときの処理} つまり、下記のように書かない i...
TRUEが定義されてる処理系だったら間違えるわけないんじゃないの?知らないけど。
無意味に処理系依存なのってどうなのってことじゃないの
言語仕様で決められてる言語なんていっぱいあるでしょ。 C限定の話なの?
プログラムの文脈によるが、そもそも foo が TRUE or FALSE のみしか入らない事が保証されてないのに、 TRUE とか FALSE と比較すると意図しない動作を引き起こす可能性がありうる(文脈によ...