14

printf()使用する%hhuunsigned char、、、、、、などに使用できます。%hishort int%zusize_t%txptrdiff_t

どの変換形式指定子を使用し_Boolますか?標準に存在しますか?

または、次のようにキャストする必要がありますか?

_Bool foo = 1;
printf("foo: %i\n", (int)foo);
4

5 に答える 5

11

タイプに固有の変換長修飾子はありません_Bool

_Boolは、値とを格納するのに十分な大きさの符号なし整数型です。次のように印刷できます。01_Bool

_Bool b = 1;
printf("%d\n", b);

整数の昇格ルールにより、_Boolに昇格することが保証されていintます。

于 2012-06-28T19:12:51.800 に答える
6

C99まで、boolは標準Cの一部ではなかったため、printf修飾子として存在していませんでした。C99、_Bool(使用している)を整数として定義しているため、(少なくともマシンの観点からは)表示する整数として細かくキャストする必要があります。または、次のようにすることもできます。

printf("%d",foo?1:0);
于 2012-06-28T18:07:23.633 に答える
2

@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

于 2012-06-28T19:01:30.810 に答える
1

ありません。または指定子intを使用してのように処理します。%d%i

_Bool

C99では、新しいブール型として新しいキーワード_Boolが導入されました。多くの点で、unsigned intのように動作しますが、他の整数型またはポインターからの変換は常に0と1に制限されます。他のunsigned型を除き、ブール型に期待されるように、このような変換は0です。問題の式が0と評価され、他のすべての場合は1である場合のみ。ヘッダーstdbool.hは、それぞれ_Bool、1、および0として定義されるマクロbool、true、およびfalseを提供します。

頭に浮かぶそれを実装する最初の方法は、charor(int8_tenumとandを使用することbit fieldsです。しかし実際には、それは異なります。これはtypedefint(私が述べたように、使用されていますが、推奨されていません。バグが発生する可能性があります)または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_ */

その他の実装:

typedef int8_t _Bool;

typedef enum { false = 0, true = 1 } bool;

typedef unsigned char Boolean; typedef _Bool Boolean;

于 2012-06-28T19:41:45.073 に答える
0

%bはJavaprintf()変換指定子に使用します。最近試してみましたが、驚いたことにうまくいきました。

コード行は次のとおりです。

System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);

出力は次のとおりです。

firstRobot == secondRobot: false
于 2013-09-22T03:35:30.827 に答える