ANSI C99 के बाद से _Bool
या के bool
माध्यम से है stdbool.h
। लेकिन क्या printf
बूल के लिए एक प्रारूप निर्दिष्ट है?
मेरा मतलब है कि छद्म कोड में कुछ ऐसा है:
bool x = true;
printf("%B\n", x);
जो प्रिंट होगा:
true
ANSI C99 के बाद से _Bool
या के bool
माध्यम से है stdbool.h
। लेकिन क्या printf
बूल के लिए एक प्रारूप निर्दिष्ट है?
मेरा मतलब है कि छद्म कोड में कुछ ऐसा है:
bool x = true;
printf("%B\n", x);
जो प्रिंट होगा:
true
जवाबों:
bool
प्रकारों के लिए कोई प्रारूप निर्दिष्ट नहीं है । हालाँकि, जब से किसी भी अभिन्न प्रकार की तुलना 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);
बजाय?
printf("%s", x ? "true" : "false");
समस्या को ठीक करेगा।
printf("%s", x ? "true" : "false");
है बेहतर है कि printf(x ? "true" : "false");
- में आप कर रहे हैं कुल प्रारूप स्ट्रिंग यहाँ के नियंत्रण तो वहाँ है कोई खतरा यह है कि यह कुछ की तरह मिल जाएगा "%d"
जो समस्याओं का कारण होगा। fputs
दूसरी ओर, है एक बेहतर विकल्प।
fputs
"और भी बेहतर" क्यों है ? मैं हमेशा अपने सी को बेहतर बनाने के तरीकों की तलाश में हूं। इसके fputs
बजाय मुझे किन परिस्थितियों में उपयोग करना चाहिए printf
?
बूल के लिए कोई प्रारूप निर्दिष्ट नहीं है। आप अभिन्न प्रकारों को प्रिंट करने के लिए कुछ मौजूदा बारीकियों का उपयोग करके इसे प्रिंट कर सकते हैं या कुछ अधिक फैंसी कर सकते हैं:
printf("%s", x?"true":"false");
bool
- C99 भाषा विशेष का यह भाग सी में प्रकार, बस में नहीं C89 संस्करण। एक नया कीवर्ड है _Bool
, और यदि आप इसमें शामिल हैं <stdbool.h>
, तो bool
इसका एक पर्याय है _Bool
।
ANSI C99 / C11 में एक अतिरिक्त प्रिंटफ़ रूपांतरण विनिर्देशक शामिल नहीं है 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;
}
चूंकि यह एक शानदार विस्तार है, जीसीसी उस कस्टम स्पेसियर के बारे में चेतावनी देता है:
$ gcc -all -g main.c -o main main.c: फ़ंक्शन में 'main': main.c: 34: 3: चेतावनी: प्रारूप में अज्ञात रूपांतरण प्रकार के चरित्र 'B' [-रूपत =] r = printf ("परिणाम है:% B \ n", b); ^ main.c: 34: 3: चेतावनी: प्रारूप के लिए बहुत सारे तर्क [-रूपत-अतिरिक्त-आर्ग]
आउटपुट:
$ ./main परिणाम है: असत्य (लिखित २१ अक्षर) $ ./main 1 परिणाम है: सच (लिखित 20 पात्र)
की परंपरा में itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
गैर-मानक जावास्क्रिप्ट (गेको और वेबिट) में "बाइनरी स्ट्रिंग टू बेस 64 स्ट्रिंग" है, इसलिए आप एक अलग नाम का उपयोग करना चाह सकते हैं।
"true\0false"[(!x)*5]
:-)
!!x*5
।
यदि आप C ++ को C से बेहतर पसंद करते हैं, तो आप यह कोशिश कर सकते हैं:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
मैं सी में एक बूल के परिणाम को 'असत्य' या 'सत्य' के रूप में छापने के लिए सर्वश्रेष्ठ तरीके से उत्तर पसंद करता हूं ? , बिलकुल इसके जैसा
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*x
वास्तव में क्या किया है यह पता लगाने में मुझे अच्छा लगा । यदि आप अन्य लोगों के साथ एक परियोजना में काम करते हैं, या सिर्फ एक परियोजना में एक कोडबेस को सफेद करते हैं जिसे आप एक्स साल बाद समझना चाहते हैं , तो इस तरह के निर्माण से बचना है।
printf("%s\n","false\0true"+6*(x?1:0));
जो केवल ... 5% कम पठनीय है।
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; }
साथ ही static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }
; बस इसे वर्णनात्मक रूप से नामित फ़ंक्शन में लपेटें और इसकी पठनीयता के बारे में चिंता न करें।