什么是布尔的printf格式说明符?

由于ANSI C99通过stdbool.h_Boolbool 。 但是,还有一个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));