まぁ、タイトルの「レガシープログラマ」とは私の事なんですけどね。
if( foo == TRUE ){
という判定文をよく見かける(fooはいろんなオブジェクトだと思ってほしい)。
個人的には、この書き方、嫌いなんだよね。
if( foo ){
か
if( foo != FALSE ){
と書いて欲しいわけよ。とにかく「TRUEか?」という判定にはして欲しくないわけです。
で、なんでこう書くの?と外注や若い連中に聞いたら、「TUREは1ですから」と必ず答える(断言する)。
あ、あれ???自分は「TRUEはFALSEでは無い。確定しているのはFALSE=0という事だけ」だとずっと思っていたんですわ。
古いC言語風に書けばこんな感じ。
#define FALSE 0 #define TRUE (!FALSE)
確かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。
新しいC++や規格ではBOOL型というのがきちんと定義されたと思うけど、製品寿命が20年とかいう私の職場では、DOSやC(K&R)、アセンブラは現役だし、プラットフォームもなにもWindowsに限らない。組み込みマイコンも使う(うちのところはVxWOKSだが)し、UNIXやLINUXも使う。
もちろん、マネージドC++(.netFramework)やC#、JAVA、Parlも私は使うし。でも、どのプラットフォームでどの言語になっても「TRUEか?」という判定文は使ってこなかった。
で、試しに、VC2008のincludeフォルダをgrepしてみたら、
#define TRUE 1
あ、ほんとに「1」だ。
typedef bool int
なんて見かけるから、やろうと思えば「5」でも何でも数字が入ってしまうわけですよ。そこで「== TRUE」なんてやられたら、絶対に成立しないわけで。バグの温床になるんじゃないかなー、と思ってかたくなに前述の姿勢を持っていたわけです。
今(最近の)言語はきちんと「BOOL」型(またはboolという名のクラス)を定義されていて、コンパイルエラーになるか、自動的に補正してもらえるのかもしれないけど、ちょっと気持ち悪い。
最近、ちょくちょく外注や若い連中と意見や話が合わず、「ああ、俺ってレガシープログラマなんだな」と思う事が多くなった今日この頃。ネットワークに平気でリトルエンディアンのデータを流すとか、勘弁して欲しい。LANアナライザでデータが見にくくてしょうが無い。
不明確な条件文になっちゃうって話だよね。主張には同意。 あと、私としては冗長な書き方をさけるという意味で、 if( foo ){ がスッキリするから好きだな。 if( foo == TRUE ){ とい...
私、Windows屋だが、比較演算子を必ず使うように取り決めている。 if ( a.isFoo() != FALSE ){ // "真"のときの処理}if ( b.isFoo() == FALSE ){ // "偽"のときの処理} つまり、下記のように書かない i...
TRUEが定義されてる処理系だったら間違えるわけないんじゃないの?知らないけど。
無意味に処理系依存なのってどうなのってことじゃないの
言語仕様で決められてる言語なんていっぱいあるでしょ。 C限定の話なの?
プログラムの文脈によるが、そもそも foo が TRUE or FALSE のみしか入らない事が保証されてないのに、 TRUE とか FALSE と比較すると意図しない動作を引き起こす可能性がありうる(文脈によ...
C++言語 fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、 そしてboolへのキャストが未定義だったり、また違う意味なのなら if (foo) { ではな...