ブールから整数への変換


131

この変換はどの程度移植性がありますか。両方のアサーションがパスすることを確認できますか?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

理由は聞かないでください。私はそれが醜いことを知っています。ありがとうございました。


なぜ最初の表現を変えないのですか?書け assert(x!=0)ます。bool(true)が移植性をint(1)に変換したとしても、「not false」アサートはより読みやすい式を持っています。
8

1
なぜそうではないのかassert( 4 < 5);assert(!( 4 > 5));
Martin York

4
@harper:必要な比較式の値を使用することは完全に合理的です。
R .. GitHub ICE HELPING ICEの停止2011

@ R._ブールから整数への変換によって妥当な結果が得られるかどうかが問題である場合、私はこれに依存しません。作成者がこの要件が満たされていることに疑問がある場合、読者は同じ問題を抱えることがあります。特に、xの値はチェックする条件ではなく、中間結果にすぎないためです。
11年

3
(4 < 5) ? 1 : 0ブール値を0または1に本当に変換する必要がある場合は、おそらく書き込みを行います。優れたコンパイラーは同じマシンコードを生成する可能性が高く、人間の読者にとってはより明確です。
ollb 2011年

回答:


205
int x = 4<5;

完全にポータブル。標準準拠。変換暗黙的です!boolint

C ++標準の4.7 / 4は(積分変換)と述べています

ソースタイプがboolの場合、値falseはゼロに変換され、値trueは1に変換されます。


Cに関しては、私が知る限り、Cにはありませんbool(1999年以前)。したがってboolint変換はC ++にのみ関連します。Cでは、値に4<5評価されintます。この場合、値はですが14>5 に評価され0ます。

編集:イェンスはコメントで、C99には_Boolタイプがあると言いました。ヘッダーファイルでbool定義されたマクロstdbool.hです。trueおよびfalseでも定義されてstdbool.hいるマクロです。

C99の7.16は言う、

マクロboolは_Boolに展開されます。

[..] true整数定数1false 展開され0ます。整数定数に展開されます。[..]


3
bool1999年以降Cにあることを確認してください。「stdbool.h」ヘッダーを使用するだけで、これが含まれます。
Jens Gustedt、2011年

1
確かに、私はいくつかのコンパイラでそれをチェックしました、そしてそれは移植可能であるようです。
pic11

8
C言語のバージョンとbool/ _Booltypeの可用性に関係intなく、Cの関係演算子はを生成しboolます。つまり、C99でも、関係演算子はを生成しintます。
AnT

51

質問に[C]と[C ++]を同時にタグ付けしました。結果は言語間で一貫していますが、回答の構造はこれらの言語ごとに異なります。

C言語では、例は何にboolも関係ありません(C99にも適用されます)。C言語では、関係演算子はbool結果を生成しません。4 > 54 < 5はどちらも、int0またはを含むタイプの結果を生成する式です1。したがって、Cの例では「ブールから整数への変換」は行われません。

C ++では、関係演算子は実際にbool結果を生成します。bool値はint型にtrue変換可能で、に変換され1、にfalse変換され0ます。これは言語によって保証されています。

PS C言語にも専用のブール型_Bool(マクロエイリアスとしてbool)があり、その整数変換規則は基本的にC ++と同じです。ただし、これはCの特定の例には関係ありintません。Cの関係演算子boolも、言語仕様のバージョンに関係なく、常に(ではなく)結果を生成します。


2
そうです、K&R Cにはブール値はありません。質問にC99のタグを付け直しました。
pic11

@ pic11:何も再タグ付けする必要はありませんでした。K&Rや他のCとは何の関係もありませんbool。C99には関係演算子がありますが、関係演算子はまだintC99で生成され、ではありませんbool。そのため、(例のように)特に関心のある関係演算子である場合、問題はとは関係ありませんbool
AnT 2011年

今私はそれを手に入れました。関係演算子の結果は暗黙的にintに変換できます。これは、C、C99、およびC ++に当てはまります。再び再タール化。
pic11 '20

3
@ pic11:いいえ、わかりません。C99を含むCでは、比較演算子の結果はintでなくboolです。変換は行われません。
R .. GitHub ICE HELPING ICEの停止2011

言語がそのような振る舞いをするboolがそのアドレスを取得することを許可しないタイプを持つことができる標準準拠の方法はありますか?多くの組み込みシステムは、このようなタイプを使用します(多くの場合、識別子を使用して宣言されますbit)。たとえばミッドレンジPICでは、if (bitVar1) bitVar2=1;2つの命令になります。の最適なコーディングはif (byteVar1) byteVar2=1;少なくとも4つです(多くのコンパイラでは、おそらく5つ)。したがって、このようなタイプはパフォーマンスを大幅に向上させることができます。
スーパーキャット2014年

17

C標準のセクション6.5.8.6は次のように述べています。

演算子<(より小)、>(より大)、<=(より小か等しい)、および> =(より大か等しい)のそれぞれは、指定された関係がtrueの場合は1を返し、trueの場合は0を返します。 false。)結果の型はintです。


参照いただきありがとうございます。歴史的な理由から、true == 1のようです。
pic11

2

int to boolキャストは暗黙的に行われるため、問題はないようです。これは、Microsoft Visual C ++、GCC、およびIntel C ++コンパイラで機能します。CまたはC ++のどちらでも問題ありません。


2
「場合によっては機能する」は、特にこれらのツールの特定されていないバージョンで、正確性をチェックするのに適した方法ではありません。私は他の答えでのアプローチを好みます。特定の実装が正しいことを保証することはできませんが、正しい実装が何をするかを保証することはできます。
マシュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.