をprintf()
使用する%hhu
とunsigned char
、、、、、、などに使用できます。%hi
short int
%zu
size_t
%tx
ptrdiff_t
どの変換形式指定子を使用し_Bool
ますか?標準に存在しますか?
または、次のようにキャストする必要がありますか?
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
タイプに固有の変換長修飾子はありません_Bool
。
_Bool
は、値とを格納するのに十分な大きさの符号なし整数型です。次のように印刷できます。0
1
_Bool
_Bool b = 1;
printf("%d\n", b);
整数の昇格ルールにより、_Bool
に昇格することが保証されていint
ます。
C99まで、boolは標準Cの一部ではなかったため、printf修飾子として存在していませんでした。C99、_Bool(使用している)を整数として定義しているため、(少なくともマシンの観点からは)表示する整数として細かくキャストする必要があります。または、次のようにすることもできます。
printf("%d",foo?1:0);
@Jackへのコメントで述べたように、「6.3.1.1p1は、の変換ランクが_Bool
他のすべての標準整数型のランクよりも低いことを示しています」。
の呼び出しでprintf
は、char
またはがプロモートされ、 (または)short
としてスタックに渡されるため、フォーマット指定子として使用するのが適切だと思います。これは、に明示的にキャストする必要がないことも意味します。これは自動的に行われるためです。int
unsigned int
%d
int
考えられる唯一の問題は、コンパイラがをどのように表す_Bool
かということです。これはおそらく実装で定義されており、コンパイラごとに異なる可能性があります。0と1または0と-1の2つの実装の可能性があります。
究極の移植性については、@ user325181の回答に従い、3値を使用して2つのオプションから選択してください。整数(コンパイラーが最適化する可能性があります)または文字列のいずれか。
編集:他の回答で報告されているように、a_Bool
は0または1のいずれかを格納できる符号なし積分型として定義されています。そのため、に渡されるとに昇格されるため、これが最も適切だと思います。指定子。unsigned
int
printf()
%u
%d
ありません。または指定子int
を使用してのように処理します。%d
%i
C99では、新しいブール型として新しいキーワード_Boolが導入されました。多くの点で、unsigned intのように動作しますが、他の整数型またはポインターからの変換は常に0と1に制限されます。他のunsigned型を除き、ブール型に期待されるように、このような変換は0です。問題の式が0と評価され、他のすべての場合は1である場合のみ。ヘッダーstdbool.hは、それぞれ_Bool、1、および0として定義されるマクロbool、true、およびfalseを提供します。
頭に浮かぶそれを実装する最初の方法は、char
or(int8_t
)enum
とandを使用することbit fields
です。しかし実際には、それは異なります。これはtypedef
、int
(私が述べたように、使用されていますが、推奨されていません。バグが発生する可能性があります)またはchar
またはunsigned int
列挙型であり#define
、一般的に使用されます。
たとえば、Appleの実装では、次のようにを使用int
します。
#ifndef _STDBOOL_H_
#define _STDBOOL_H_
#define __bool_true_false_are_defined 1
#ifndef __cplusplus
#define false 0
#define true 1
#define bool _Bool
#if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int _Bool;
#endif
#endif /* !__cplusplus */
#endif /* !_STDBOOL_H_ */
その他の実装:
私%b
はJavaprintf()
変換指定子に使用します。最近試してみましたが、驚いたことにうまくいきました。
コード行は次のとおりです。
System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);
出力は次のとおりです。
firstRobot == secondRobot: false