をprintf()使用する%hhuとunsigned char、、、、、、などに使用できます。%hishort int%zusize_t%txptrdiff_t
どの変換形式指定子を使用し_Boolますか?標準に存在しますか?
または、次のようにキャストする必要がありますか?
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
タイプに固有の変換長修飾子はありません_Bool。
_Boolは、値とを格納するのに十分な大きさの符号なし整数型です。次のように印刷できます。01_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としてスタックに渡されるため、フォーマット指定子として使用するのが適切だと思います。これは、に明示的にキャストする必要がないことも意味します。これは自動的に行われるためです。intunsigned int%dint
考えられる唯一の問題は、コンパイラがをどのように表す_Boolかということです。これはおそらく実装で定義されており、コンパイラごとに異なる可能性があります。0と1または0と-1の2つの実装の可能性があります。
究極の移植性については、@ user325181の回答に従い、3値を使用して2つのオプションから選択してください。整数(コンパイラーが最適化する可能性があります)または文字列のいずれか。
編集:他の回答で報告されているように、a_Boolは0または1のいずれかを格納できる符号なし積分型として定義されています。そのため、に渡されるとに昇格されるため、これが最も適切だと思います。指定子。unsignedintprintf()%u%d
ありません。または指定子intを使用してのように処理します。%d%i
C99では、新しいブール型として新しいキーワード_Boolが導入されました。多くの点で、unsigned intのように動作しますが、他の整数型またはポインターからの変換は常に0と1に制限されます。他のunsigned型を除き、ブール型に期待されるように、このような変換は0です。問題の式が0と評価され、他のすべての場合は1である場合のみ。ヘッダーstdbool.hは、それぞれ_Bool、1、および0として定義されるマクロbool、true、およびfalseを提供します。
頭に浮かぶそれを実装する最初の方法は、charor(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