bool的printf格式说明符是什么?

从ANSI C99开始,有_Boolboolstdbool.h。但是bool是否也有printf格式说明符?

我的意思是在伪代码中

bool x = true;
printf("%B\n", x);

这将打印:

true
1102083 次浏览

bool没有格式说明符。你可以使用一些现有的用于打印整型的说明符来打印它,或者做一些更奇特的事情:

printf("%s", x?"true":"false");

bool类型没有格式说明符。然而,由于任何比int短的整型在传递给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);

而不是?

你不能,但你可以打印0或1

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

< a href = " https://stackoverflow.com/questions/11250297/printf-conversion-specifier-for-bool " > < / >来源

itoa()的传统中:

#define btoa(x) ((x)?"true":"false")


bool x = true;
printf("%s\n", btoa(x));

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: In function ‘main’:
main.c:34:3: warning: unknown conversion type character ‘B’ in format [-Wformat=]
r = printf("The result is: %B\n", b);
^
main.c:34:3: warning: too many arguments for format [-Wformat-extra-args]

输出:

$ ./main
The result is: false
(written 21 characters)
$ ./main 1
The result is: true
(written 20 characters)

我更喜欢打印bool类型结果的最佳方法为'false'或& # 39;真正的# 39;在c语言中?的答案,就像

printf("%s\n", "false\0true"+6*x);
  • X == 0, "false\0true"+ 0"表示"false";
  • X == 1, "false\0true"+ 6",表示"true";

如果你喜欢c++胜过C,你可以试试这个:

#include <ios>
#include <iostream>


bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;

要根据我刚刚使用的布尔值打印1或0:

printf("%d\n", !!(42));

对Flags特别有用:

#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));