Поскольку ANSI C99 имеет _Bool или bool через stdbool.h. Но существует ли спецификатор формата printf для bool?
Я имею в виду что-то вроде этого псевдокода:
bool x = true;
printf("%B\n", x);
который будет печатать:
true
Поскольку ANSI C99 имеет _Bool или bool через stdbool.h. Но существует ли спецификатор формата printf для bool?
Я имею в виду что-то вроде этого псевдокода:
bool x = true;
printf("%B\n", x);
который будет печатать:
true
Нет. Но так как любой целочисленный тип короче 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 не включает дополнительный спецификатор преобразования printf для 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: 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)
В традиции itoa():
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
Вы не можете, но вы можете печатать 0 или 1
_Bool b = 1;
printf("%d\n", b);
Я предпочитаю ответ от Лучший способ напечатать результат bool как "false" или "true" в c?, точно так же, как
printf("%s\n", "false\0true"+6*x);
Если вам нравится С++ лучше, чем C, вы можете попробовать следующее:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
Чтобы просто напечатать 1 или 0 на основе логического значения, которое я использовал:
printf("%d\n", !!(42));
Особенно полезно с флагами:
#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));