什么是布尔的printf格式说明符?
由于ANSI C99通过stdbool.h
有_Bool
或bool
。 但是,还有一个printf
格式说明符的布尔?
我的意思是像这样的伪代码:
bool x = true; printf("%B\n", x);
这将打印:
true
没有。 但是由于比int
整数types在传递给printf()
的可变参数时被提升为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);
代替?
没有布尔的格式说明符。 您可以使用一些现有的说明符打印整型,或者做更多的事情:
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 -Wall -g main.c -o main main.c:在函数'main'中: main.c:34:3:警告:格式为[-Wformat =]的未知转换types字符“B” 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));
你不能,但你可以打印0或1
_Bool b = 1; printf("%d\n", b);
资源
如果你喜欢C比C更好,你可以试试这个:
#include <ios> #include <iostream> bool b = IsSomethingTrue(); std::cout << std::boolalpha << b;
我更喜欢最好的方式来打印一个布尔的结果为“假”或“真”在C? , 就像
printf("%s\n", "false\0true"+6*x);
- x == 0,“false \ 0true”+ 0“表示”false“;
- x == 1,“false \ 0true”+ 6“表示”true“;
根据刚刚使用的布尔值打印1或0:
printf("%d\n", !!(42));
对Flags特别有用:
#define MY_FLAG (1 << 4) int flags = MY_FLAG; printf("%d\n", !!(flags & MY_FLAG));