617 votes

Quel est le spécificateur de format printf pour bool ?

Depuis la norme ANSI C99, il existe _Bool o bool via stdbool.h . Mais existe-t-il aussi un printf spécificateur de format pour bool ?

Je veux dire quelque chose comme dans ce pseudo-code :

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

qui s'imprimerait :

true

1 votes

Vous pouvez lire ceci pour plus d'informations cplusplus.com/reference/cstdio/printf Mais vous pouvez toujours le faire !

0 votes

3 votes

@billinkc, ma question n'est pas vraiment à propos de quoi le meilleur moyen est d'imprimer des valeurs de bools - il s'agit d'un spécificateur printf concret. Qui ne semble pas exister. Un autre angle pour une bonne réponse serait : peut-être qu'il y a un moyen d'ajouter un spécificateur de format personnalisé à printf qui fait la conversion bool ...

3voto

Arsen Y.M. Points 617

Si vous préférez le C++ au C, vous pouvez essayer ceci :

#include <ios>
#include <iostream>

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

9 votes

Cette réponse est hors sujet et doit être supprimée, car elle concerne une autre langue que celle de la question.

6 votes

@Lundin Je ne suis pas d'accord sur le fait que cela devrait être supprimé. Le but de l'OS n'est pas d'aider une seule personne, mais d'aider toutes les personnes ayant la même question. Lorsque je cherche sprintf print boolean as true false c++ c'est la première page qui s'affiche (bien que l'on puisse soutenir que cette page aurait pu être le premier résultat si cette réponse n'existait pas). Comme le C++ est presque un sur-ensemble du C, je ne pense pas que de telles réponses devraient être écartées aussi facilement. +1 de ma part.

1 votes

@JeffG Oui, de telles réponses doivent être supprimées, nous avons des politiques très claires. Lisez les wikis des tags C et C++. Cette question n'est pas utile aux programmeurs C. notamment parce que les systèmes booléens du C et du C++ sont entièrement différents. et la question est étiquetée C. Le fait que Google ne soit pas en mesure de comprendre les deux ++ qui suivent dans votre recherche n'est pas le problème de SO.

3voto

Tarion Points 1867

Pour juste imprimer 1 ou 0 en fonction de la valeur booléenne que je viens d'utiliser :

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

Particulièrement utile avec les drapeaux :

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

1 votes

Attention, le !! pourrait être optimisé

1 votes

@interestedparty333 : Si MY_FLAG était égal à 1, alors !!(flags & MY_FLAG) pourrait être remplacé par (flags & MY_FLAG) mais un compilateur non corrompu ne serait pas en mesure d'optimiser l'absence de !! à moins qu'il ne puisse prouver que l'opérande ne peut avoir aucune autre valeur que 0 ou 1.

-1voto

xjzhou Points 101

Je préfère une réponse de La meilleure façon d'imprimer le résultat d'un bool comme 'false' ou 'true' en C ? tout comme

printf("%s\n", "false\0true"+6*x);
  • x == 0, "faux \0true "+ 0" cela signifie "faux" ;
  • x == 1, "faux \0true "+ 6" cela signifie "vrai" ;

29 votes

C'est totalement incompréhensible. Il m'a fallu un bon moment avant de comprendre ce que "false\0true"+6*x vraiment. Si vous travaillez dans un projet avec d'autres personnes, ou simplement dans un projet avec une base de code que vous voulez comprendre x des années plus tard, des constructions comme celle-ci sont à éviter.

3 votes

Bien que je vois que cela pourrait être plus optimisé puisqu'il n'y a pas de branche. Si la vitesse est votre préoccupation, cela peut être une option, assurez-vous simplement d'expliquer la mécanique derrière l'astuce dans un commentaire. Une fonction ou une macro en ligne avec un nom auto-documenté serait également utile (mais probablement pas suffisante dans ce cas).

3 votes

Outre les problèmes de lisibilité, il faut garder à l'esprit que le problème se posera si quelqu'un introduit une valeur autre que 0 ou 1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X