由于 ANSI C99 存在_Bool
或bool
通过stdbool.h
. 但是是否还有printf
bool 的格式说明符?
我的意思是在那个伪代码中:
bool x = true;
printf("%B\n", x);
这将打印:
true
类型没有格式说明符bool
。但是,由于任何小于在传递给可变参数时int
提升为的整数类型,您可以使用:int
printf()
%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
.
但是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 -Wall -g main.c -o main main.c:在函数'main'中: main.c:34:3:警告:未知转换类型字符“B”,格式为 [-Wformat=] r = printf("结果是:%B\n", b); ^ main.c:34:3:警告:格式参数过多 [-Wformat-extra-args]
输出:
$ ./main 结果是:假 (写 21 个字符) $ ./main 1 结果是:真 (写20个字)
在传统中itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
根据我刚刚使用的布尔值打印 1 或 0:
printf("%d\n", !!(42));
对标志特别有用:
#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;
我更喜欢Best way to print the result as 'false' or 'true' in c? , 就像
printf("%s\n", "false\0true"+6*x);