どのC ++コンパイラでも(bool)true ==(int)1と想定できますか?


118

(bool)true == (int)1すべてのC ++コンパイラを想定できますか?


3
あなたの質問のキャストは冗長です、逆にする必要がありますか?
GManNickG 2010

9
彼はそれらがキャストであることを意味しません、彼は意味しますbool t = true; int n = 1; if (t == n) {...} ;
egrunin

7
@egrunin:ええ、でもtrueはboolで1はintです。:)
GManNickG 2010

1
そうです、値のタイプを述べるつもりでした。
ペトルザ

2
(int) true1整数値ですが、if (pointer)ifの場合、then部分を通過するようなものですpointer != 0。あなたが本当であると想定できる唯一のことはfalse == 0、そしてtrue != 0(そしてキャストtrueされた1ときに評価されるint
Luis Colorado

回答:


134

はい。キャストは冗長です。あなたの表現では:

true == 1

統合プロモーションが適用され、ブール値はに昇格され、intこの昇格は1になるはずです。

参照:4.7 [conv.integral] / 4:ソースタイプがbool...の場合、true1に変換されます。


9
@Joshua:true言語によって定義されたキーワードです。ライブラリで再定義することはできません。#defineキーワードを再定義することはできません。
2010

21
@jalf:#defineは実際にシステムキーワードを定義することが許可されています。Cコンパイルの前処理フェーズは、純粋にテキストであり、キーワードやC構文一般については何も知りません。それにもかかわらず、もちろん、ほとんどの場合、言語のキーワードを再定義することは悪い考えです。
Dale Hagglund、2010

2
@jalf。彼らは違いますか?参照gcc.gnu.org/onlinedocs/cpp/Macros.html、少なくとも一度尋ね国際難読Cコードコンテスト、のいずれかのエントリー「ない場合whileは時間がかかるしませんか?」(回答:2つのパラメーターを使用する場合、そのエントリは#definedそれを持っているためprintfです。)
Ken Bloom

3
C99、§6.10.1/ 1は次のように述べています:「条件付き包含を制御する式は、以下を除いて整数定数式でなければなりません:キャストを含まないこと。直接の許可としては述べられていませんが、これは明らかに、キーワードと「字句的に同一」であるマクロの可能性を想定しています。
ジェリーコフィン

2
ああ、そして#definesはキーワードを再定義することができます。C ++ 1xは、新しいキーワードで多くの問題を引き起こしたため、要件を削除する必要がありました。
ジョシュア

18

Charles Baileyの答えは正しいです。C ++標準からの正確な表現は(§4.7/ 4)です。「ソースタイプがブールの場合、値falseはゼロに変換され、値trueは1に変換されます。」

編集:彼も参照を追加したようです-気が散って忘れない限り、これをまもなく削除します...

Edit2:次に、ブール値自体は常に0または1に変換されますが、多くの関数(特にC標準ライブラリから)は「基本的にブール」でintあるが、通常、falseを示すにはゼロ、trueを示すにはゼロ以外の値のみが必要です。たとえば、is *関数は<ctype.h>、ゼロまたは非ゼロのみを必要とし、必ずしもゼロまたは1である必要はありません。

これをにキャストするとbool、ゼロはfalseに変換され、ゼロ以外はtrueに変換されます(期待どおり)。


9

標準によると、その前提で安全である必要があります。C ++ boolタイプには2つの値がtrueありfalse、対応する値は1と0です。

注意すべきことは、bool式と変数をBOOL式と変数と混合することです。後者はFALSE = 0and として定義されます。TRUE != FALSE実際には、0以外の値が考慮されることはよくありTRUEます。

最近のコンパイラの多くは、実際に暗黙のうちからキャストしようとするすべてのコードに対して警告を発行しますBOOLbool場合はBOOL値が0または1と異なるが。


3

コンパイラーが異なると、trueでも結果が異なることがわかりました。また、ほとんどの場合、ブールではなくブールのほうがintよりも優れていることがわかりました。これらのintは、プログラムの進化に伴って時間の経過とともに値が変化する傾向にあり、trueが1であると想定すると、コードの他の場所での無関係な変更に噛まれる可能性があります。


3
これは、true動作が定義された言語キーワードと同様に、C ++の不正解です。などの一般的に定義されているマクロを参照する場合TRUE、それは正しいです。
David Thornley、2010

1
私の経験はCコンパイラに関するものだったのかもしれません-私は何年にもわたってそれらと一緒にたくさんの時間を費やしてきました。ifステートメントで数学式を直接使用することについての私のポイントは、しかし立っています。ifでビットシフトがゼロ以外であるかどうかを確認するコードがあり、他の誰かが同じゼロ以外の値を取り、それを1であると想定し、データを破壊しました。true / 1への単純な変換はそれを防ぎました。
マイケルドーガン、2010

私もこのような行動を見てきました。確かに、最後にそれを見たのは1999年頃でした。私はGCCを使用していました。言語はCでした。それでも、私は確かにそのような行動を見てきました。
2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.