int रूपांतरण के लिए बूल


131

यह रूपांतरण कितना पोर्टेबल है। क्या मुझे यकीन है कि दोनों दावे पारित होंगे?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

क्यों न पूछें। मुझे पता है कि यह बदसूरत है। धन्यवाद।


आपका पहला अभिव्यक्ति क्यों नहीं बदला? आप लिख सकते हैं assert(x!=0)। भले ही बूल (सच) पोर्टेबल को इंट (1) में परिवर्तित कर देता है, "झूठे नहीं" का दावा अधिक पठनीय अभिव्यक्ति है।
हार्पर

1
क्यों नहीं: assert( 4 < 5);औरassert(!( 4 > 5));
मार्टिन यॉर्क

4
@harper: एक तुलना अभिव्यक्ति के आवश्यक मूल्य का उपयोग करना पूरी तरह से उचित है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

@ R._ जब सवाल यह है कि बूल-टू-इंट रूपांतरण एक उचित परिणाम देता है, तो मैं इस पर भरोसा नहीं करूंगा। जब लेखक को संदेह होता है कि यह आवश्यकता पूरी हो गई है, तो पाठक को वही समस्या हो सकती है। विशेष रूप से क्योंकि x का मान जाँचने की शर्त नहीं है बल्कि केवल एक मध्यवर्ती परिणाम है।
हार्पर

3
मैं शायद लिखूंगा (4 < 5) ? 1 : 0कि अगर मुझे वास्तव में एक बूलियन को 0 या 1 में बदलने की आवश्यकता है, तो एक अच्छा संकलक संभवतः एक ही मशीन कोड का उत्पादन करेगा और यह एक मानव पाठक के लिए स्पष्ट है।
ollb

जवाबों:


205
int x = 4<5;

पूरी तरह से पोर्टेबल। मानक अनुरूप। boolकरने के लिए intरूपांतरण निहित है!

C ++ मानक से §4.7 / 4 कहते हैं (इंटीग्रल रूपांतरण )

यदि स्रोत प्रकार बूल है, तो मान falseशून्य में बदल जाता है और मान trueएक में बदल जाता है


सी के रूप में, के रूप में तक मुझे पता है कि वहाँ कोई है boolसी में (1999 से पहले) तो boolकरने के लिए intरूपांतरण है केवल C ++ प्रासंगिक। सी में, मूल्य का 4<5मूल्यांकन करता है int, इस मामले में मूल्य है 1, 4>5 का मूल्यांकन करेगा 0

EDIT: जेन्स ने टिप्पणी में कहा, C99 के _Boolप्रकार हैं। हैडर फ़ाइल boolमें परिभाषित मैक्रो है stdbool.htrueऔर falseमैक्रो में भी परिभाषित हैं stdbool.h

C99 से §7.16 कहता है,

मैक्रो का boolविस्तार _Bool तक है।

[..] trueजो पूर्णांक स्थिरांक तक फैलता है 1, falseजो पूर्णांक स्थिरांक तक फैलता है 0, [..]


3
यकीन है कि bool1999 के बाद से सी में है। बस "stdbool.h" हेडर का उपयोग करें और इसे शामिल किया जाना चाहिए।
जेन्स गुस्तेद

1
दरअसल, मैंने इसे कई कंपाइलरों पर चेक किया और यह पोर्टेबल लग रहा है।
पिक

8
सी भाषा के संस्करण और bool/ _Boolप्रकार की उपलब्धता के बावजूद , सी उत्पादन में रिलेशनल ऑपरेटर int, नहीं bool। यानी C99 में भी, रिलेशनल ऑपरेटर अभी भी उत्पादन करते हैं int
एनटी

51

आपने उसी समय अपने प्रश्न [C] और [C ++] को टैग किया था। परिणाम भाषाओं के बीच संगत होंगे, लेकिन इनमें से प्रत्येक भाषा के लिए उत्तर की संरचना अलग है।

सी भाषा में आपके उदाहरणों का कोई संबंध boolनहीं है (जो कि C99 पर भी लागू होता है)। सी भाषा में रिलेशनल ऑपरेटर boolपरिणाम नहीं देते हैं । दोनों 4 > 5और 4 < 5भाव हैं जो intमानों के साथ प्रकार के परिणाम उत्पन्न करते हैं 0या 1। इसलिए, सी में आपके उदाहरणों में किसी भी प्रकार की कोई "बूल टू इंट कनवर्ज़न" नहीं है।

C ++ में रिलेशनल ऑपरेटर वास्तव में boolपरिणाम उत्पन्न करते हैं। boolमान परिवर्तित करने और परिवर्तित करने के intसाथ, प्रकार के trueलिए परिवर्तनीय हैं । यह भाषा की गारंटी है।1false0

पीएस सी भाषा में एक समर्पित बूलियन प्रकार _Bool(मैक्रो-अलियास के रूप में bool) है, और इसके अभिन्न रूपांतरण नियम अनिवार्य रूप से सी ++ के समान हैं। लेकिन फिर भी यह सी में आपके विशिष्ट उदाहरणों के लिए प्रासंगिक नहीं है। एक बार फिर, सी में रिलेशनल ऑपरेटर हमेशा भाषा विनिर्देश के संस्करण की परवाह किए बिना int(नहीं bool) परिणाम देते हैं।


2
यह सही है, K & R C. में कोई बूल नहीं है। मैंने अपने प्रश्न को C99 के रूप में पुनः टैग किया है।
पिक

@ pic11: कुछ भी रिटग करने की जरूरत नहीं थी। इसका K & R या किसी अन्य C. से कोई लेना देना नहीं है। boolC99 में होने के बावजूद , रिलेशनल ऑपरेटर अभी भी intC99 में उत्पादन करते हैं , नहीं bool। इसलिए, यदि यह विशेष रूप से संबंधपरक ऑपरेटर है जिसमें आपकी रुचि है (जैसा कि आपके उदाहरणों में है), इस मुद्दे का अभी भी कोई लेना-देना नहीं है bool
एनटी

अब मैं समझ गया। रिलेशन ऑपरेटर का नतीजा अंतर के रूप में स्पष्ट रूप से परिवर्तनीय है। यह C, C99 और C ++ में सही है। फिर से छेड़छाड़ की।
पिक

3
@ pic11: नहीं, आपको नहीं मिलेगा। C99 सहित C में, तुलना ऑपरेटर का परिणाम है a int, a नहीं boolकोई रूपांतरण नहीं होता है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

क्या कोई मानक-अनुरूप तरीका है जिसके माध्यम से एक भाषा का एक प्रकार हो सकता है जो व्यवहार करता है boolलेकिन अपने पते को लेने की अनुमति नहीं देता है? कई एम्बेडेड सिस्टम ऐसे प्रकारों का उपयोग करते हैं (अक्सर पहचानकर्ता का उपयोग करके घोषित किया जाता है bit)। उदाहरण के लिए, एक मिड-रेंज PIC, if (bitVar1) bitVar2=1;दो निर्देश होंगे; इष्टतम कोडिंग if (byteVar1) byteVar2=1;कम से कम चार (कई संकलक पर, शायद पांच) होगी। इस प्रकार के प्रकार एक प्रमुख प्रदर्शन को बढ़ावा दे सकते हैं।
१६:०५ पर सुपरकैट

17

सी मानक के खंड 6.5.8.6 में कहा गया है:

प्रत्येक ऑपरेटर <(से कम),> (इससे बड़ा), <= (इससे कम या इसके बराबर), और> = (इससे बड़ा या बराबर) 1 प्राप्त होगा यदि निर्दिष्ट संबंध सत्य है और 0 है तो गलत।) परिणाम में int है।


संदर्भ के लिए धन्यवाद। ऐसा लगता है कि ऐतिहासिक कारणों से यह सच है == 1।
पिक

2

लगता है कि कोई समस्या नहीं है क्योंकि बूल कास्ट के लिए निहित रूप से किया जाता है। यह Microsoft Visual C ++, GCC और Intel C ++ कंपाइलर में काम करता है। C या C ++ में कोई समस्या नहीं है।


2
"यह कुछ मामलों में काम करता है" शुद्धता के लिए जाँच करने का एक अच्छा तरीका नहीं है, खासकर उन उपकरणों के अनिर्दिष्ट संस्करणों के साथ। मैं अन्य उत्तरों में दृष्टिकोण पसंद करता हूं; वे गारंटी नहीं दे सकते कि कोई विशेष कार्यान्वयन सही है, लेकिन वे गारंटी दे सकते हैं कि एक सही कार्यान्वयन क्या करेगा।
मैथ्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.