ANSI C99以降、_Bool
を介したstdbool.h
またはbool
があります。しかし、bool用のprintf
フォーマット指定子もありますか?
私はその擬似コードのようなものを意味します:
bool x = true;
printf("%B\n", x);
これは印刷されます:
true
ありません。しかし、int
より短い整数型はprintf()
sの可変引数に渡されるとint
に昇格されるので、%d
を使うことができます。
bool x = true;
printf("%d\n", x); // prints 1
しかし、そうではありません
printf(x ? "true" : "false");
以上
printf("%s", x ? "true" : "false");
あるいはもっと良い
fputs(x ? "true" : "false", stdout);
代わりに?
Boolにはフォーマット指定子がありません。整数型を印刷するための既存の指定子のいくつかを使ってそれを印刷することができます。
printf("%s", x?"true":"false");
ANSI C99/C11には、bool
用の追加のprintf変換指定子は含まれていません。
しかし GNU Cライブラリはカスタム指定子を追加するためのAPIを提供します 。
例:
#include <stdio.h>
#include <printf.h>
#include <stdbool.h>
static int bool_arginfo(const struct printf_info *info, size_t n,
int *argtypes, int *size)
{
if (n) {
argtypes[0] = PA_INT;
*size = sizeof(bool);
}
return 1;
}
static int bool_printf(FILE *stream, const struct printf_info *info,
const void *const *args)
{
bool b = *(const bool*)(args[0]);
int r = fputs(b ? "true" : "false", stream);
return r == EOF ? -1 : (b ? 4 : 5);
}
static int setup_bool_specifier()
{
int r = register_printf_specifier('B', bool_printf, bool_arginfo);
return r;
}
int main(int argc, char **argv)
{
int r = setup_bool_specifier();
if (r) return 1;
bool b = argc > 1;
r = printf("The result is: %B\n", b);
printf("(written %d characters)\n", r);
return 0;
}
これはglibcの拡張なので、GCCはそのカスタム指定子について警告します。
$ gcc - 壁 - g main.c - o main main.c:関数 'main'内: main.c:34:3:警告:変換タイプが不明です[-Wformat =] r = printf( "結果は%B\n"、b); ^ main.c:34 :3:警告:formatには引数が多すぎます[-Wformat-extra-args]
出力:
$ ./main 結果は、次のとおりです。false (21文字の文字で書かれた) (20文字の表記)
itoa()
の伝統では:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
cからboolの結果を 'false'または 'true'として出力する最良の方法は? 、ちょうど同じ
printf("%s\n", "false\0true"+6*x);
先ほど使用したブール値に基づいて1または0を出力するだけです。
printf("%d\n", !!(42));
Flagsで特に役に立ちます:
#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));
CよりC++が好きなら、これを試すことができます。
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;