ANSI C99 yana olduğunu _Bool
veya bool
üzeri stdbool.h
. Ancak printf
bool için bir format belirleyici var mı?
Bu sözde kod gibi bir şey demek istiyorum:
bool x = true;
printf("%B\n", x);
yazdırılacak olan:
true
ANSI C99 yana olduğunu _Bool
veya bool
üzeri stdbool.h
. Ancak printf
bool için bir format belirleyici var mı?
Bu sözde kod gibi bir şey demek istiyorum:
bool x = true;
printf("%B\n", x);
yazdırılacak olan:
true
Yanıtlar:
Türler için biçim belirteci yoktur bool
. Ancak, varyasyon argümanlarına aktarıldığında int
tanıtıldığından daha kısa olan herhangi bir integral türü şunları kullanabilirsiniz :int
printf()
%d
bool x = true;
printf("%d\n", x); // prints 1
Ama neden olmasın:
printf(x ? "true" : "false");
ya da daha iyisi:
printf("%s", x ? "true" : "false");
veya daha da iyisi:
fputs(x ? "true" : "false", stdout);
yerine?
printf("%s", x ? "true" : "false");
sorunu çözer.
printf("%s", x ? "true" : "false");
daha iyi tartışmaya eğilimi olacaktır printf(x ? "true" : "false");
- burada biçim dizesinin tam kontrolü altındasınız, bu yüzden sorunlara neden olacak bir şey elde etme tehlikesi yoktur"%d"
. fputs
Öte yandan, bir daha iyi bir seçenek.
fputs
" Neden daha iyi"? Her zaman C'mi geliştirmenin yollarını arıyorum. Hangi koşullar fputs
yerine kullanmalıyım printf
?
Bool için format belirleyici yok. Entegre türleri yazdırmak için mevcut belirteçlerden bazılarını kullanarak yazdırabilir veya daha süslü bir şey yapabilirsiniz:
printf("%s", x?"true":"false");
bool
- C99 dil spec 's parçası C tipi, sadece değil C89 baskı. Yeni bir anahtar kelime var _Bool
ve eklerseniz <stdbool.h>
, bool
eşanlamlıdır _Bool
.
ANSI C99 / C11 için fazladan bir printf dönüşüm belirteci içermez bool
.
Ancak GNU C kütüphanesi, özel tanımlayıcılar eklemek için bir API sağlar .
Bir örnek:
#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;
}
Bir glibc uzantısı olduğundan GCC bu özel belirleyici hakkında uyarır:
$ gcc -Duvar -g main.c -o ana main.c: 'main' işlevinde: main.c: 34: 3: uyarı: [-Wformat =] biçiminde bilinmeyen dönüşüm türü karakter 'B' r = printf ("Sonuç:% B \ n", b); ^ main.c: 34: 3: uyarı: biçim için çok fazla argüman [-Wformat-extra-args]
Çıktı:
$ ./main Sonuç: yanlış (yazılı 21 karakter) $ ./alan 1 Sonuç: doğru (yazılı 20 karakter)
Geleneğinde itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
standart olmayan JavaScript'te (Gecko ve WebKit) "binary string to base 64 string" dir, bu nedenle farklı bir ad kullanmak isteyebilirsiniz.
"true\0false"[(!x)*5]
:-)
!!x*5
.
C ++ 'dan C'den daha iyi isterseniz, bunu deneyebilirsiniz:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
Az önce kullandığım boolean değerine göre 1 veya 0 yazdırmak için:
printf("%d\n", !!(42));
Özellikle Bayraklarda kullanışlıdır:
#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));
!!
Ben bir bool sonucu 'yanlış' veya 'true' olarak yazdırmak için En iyi yolu bir cevap tercih ? , tıpkı
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*x
Gerçekten ne yaptığını anlayabilmem biraz zamanımı aldı . Başka insanlarla bir projede veya sadece x yıl sonra anlamak istediğiniz bir kod tabanındaki bir projede çalışıyorsanız , bunun gibi yapılardan kaçınılmalıdır.
printf("%s\n","false\0true"+6*(x?1:0));
...% 5 daha az okunabilir.
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; }
İle aynı static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }
; sadece tanımlayıcı olarak adlandırılmış bir işleve sarın ve okunabilirliği konusunda endişelenmeyin.