क्या ऑपरेशन "गलत <सही" अच्छी तरह से परिभाषित है?


153

क्या C ++ विनिर्देश परिभाषित करता है:

  1. बूलियन मापदंडों के लिए 'कम से कम' ऑपरेटर का अस्तित्व, और यदि हां, तो
  2. 4 पैरामीटर क्रमपरिवर्तन का परिणाम है?

दूसरे शब्दों में, विनिर्देश द्वारा परिभाषित निम्नलिखित कार्यों के परिणाम हैं?

false < false
false < true
true < false
true < true

मेरे सेटअप पर (Centos 7, gcc 4.8.2), नीचे दिए गए कोड से मुझे पता चलता है कि मुझे क्या उम्मीद है (0 के रूप में झूठी का प्रतिनिधित्व करने का C का इतिहास) और 1 के रूप में सच है:

false < false = false
false < true = true
true < false = false
true < true = false

Whilst मैं बहुत यकीन है कि सबसे (सभी?) संकलक एक ही उत्पादन दे देंगे, इस C ++ विनिर्देशन द्वारा विधायी है? या एक अड़ियल है, लेकिन विनिर्देश-अनुरूप संकलक को यह तय करने की अनुमति है कि सच झूठ से कम है?

#include <iostream>

const char * s(bool a)
{
  return (a ? "true" : "false");
}

void test(bool a, bool b)
{
  std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}

int main(int argc, char* argv[])
{
  test(false, false);
  test(false, true);
  test(true, false);
  test(true, true);
  return 0;
}

6
@ पूर्वव्यापी मान्य उपयोग हैं। इस तरह का उपयोग कर के रूप में std::minपर std::vector<bool>के रूप में &&
Angew अब

19
@ यदि आप एक अच्छे प्रश्न का पता लगा सकते हैं, जो स्टैकऑवरफ्लो के इन सभी वर्षों के बाद भी नहीं पूछा गया है, तो आप कुछ बिंदुओं के लायक हैं । यह ट्रोलिंग नहीं है।
मार्क रैनसम

35
@Ulterior पूछने की प्रेरणा वास्तविक है: मैं C ++ (C से आने वाला) के लिए काफी नया हूँ और कुछ वस्तुओं को std :: set <> में संग्रहीत करना चाहता हूँ। मेरे ऑब्जेक्ट के <ऑपरेटर का मेरा कार्यान्वयन मुख्य रूप से ऑब्जेक्ट की बूलियन संपत्ति पर आधारित है, इसके बाद अन्य माध्यमिक पहचानने वाले गुण हैं। जब सेट पर पुनरावृत्ति होती है, तो मैं सुनिश्चित करना चाहता हूं कि 'झूठी' वस्तुएं पहले आएं। हालांकि यह मेरे लिए यहां और अब काम करता है, मैं आश्वस्त हूं कि यह प्लेटफार्मों (एम्बेडेड वाले सहित) में काम करने की गारंटी है, बिना मेरी वस्तु के <(a? 1: 0), या इसी तरह के उपयोग के लिए अनावश्यक रूप से सहारा लेने के बिना? ऑपरेटर।
डंकन

26
एक परेशान परिणाम यह है p <= qकि p implies qकब pऔर qप्रकार के बूल के हैं!
थियोडोर नॉरवेल

4
संभवत: @Technophile विचलित करने वाली बात यह है कि <=अनजाने में एक गौरैया के रूप में पढ़ा जा सकता है, और यह कि "केवल अगर" (यानी, "[भौतिक रूप से] तात्पर्य है")) कभी-कभी टकराना अनौपचारिक या इसी तरह से होता है =>(यानी, एक दोगुना शाफ्ट जैसा दिखता है =) । एक बैरोरो को कभी-कभी "यदि," के रूप में पढ़ा जाता है, हालांकि मेरा मानना ​​है कि यह "केवल अगर" के लिए एक बैरो के उपयोग की तुलना में बहुत कम आम है।
एलियाह कगन

जवाबों:


207

टी एल; डॉ:

संचालन C ++ मानक के मसौदे के अनुसार अच्छी तरह से परिभाषित हैं।

विवरण

हम देख सकते हैं कि ड्राफ्ट C ++ मानक अनुभाग से संबंधित 5.9 परिचालक ऑपरेटर के पास जाता है जो कहता है ( जोर मेरा आगे बढ़ना ):

ऑपरेंड अंकगणित होगा , गणन, या सूचक प्रकार , या प्रकार std :: nullptr_t। ऑपरेटर <(से कम),> (से अधिक), <= (से कम या बराबर), और> = (से अधिक या बराबर) सभी गलत या सत्य उपज देते हैं। परिणाम का प्रकार बूल है

और बूल 3.9.1 से मौलिक प्रकार हैं

प्रकार बूल , चार, char16_t, char32_t, wchar_t, और हस्ताक्षरित और अहस्ताक्षरित पूर्णांक प्रकार को सामूहिक रूप से अभिन्न प्रकार कहा जाता है।

तथा

इंटीग्रल और फ्लोटिंग प्रकारों को सामूहिक रूप से अंकगणितीय प्रकार कहा जाता है।

और trueऔर falseसे बूलियन शाब्दिक हैं 2.14.6बूलियन शाब्दिक:

boolean-literal:
    false
    true

5.9आगे रिलेशनल ऑपरेटरों के यांत्रिकी को देखने के लिए खंड पर जा रहे हैं, यह कहता है:

सामान्य अंकगणित रूपांतरण अंकगणितीय या गणना प्रकार के ऑपरेंड पर किए जाते हैं।

सामान्य गणित रूपांतरण खंड में शामिल किया जाता है 5जो कहते हैं:

अन्यथा, दोनों प्रचालनों पर अभिन्न पदोन्नति (4.5) की जाएगी

और अनुभाग 4.5कहता है:

टाइप बूल का एक प्रचलन टाइप इंट के प्रचलन में बदला जा सकता है, जिसमें झूठ शून्य और सच्चा एक हो जाता है।

और इसलिए भाव:

false < false
false < true
true < false
true < true

इन नियमों का उपयोग कर बन जाते हैं:

0 < 0
0 < 1
1 < 0
1 < 1

6
अच्छा है, यह किसी भी उत्तर के रूप में स्पष्ट रूप से स्पष्ट हो सकता है, जबकि अभी भी पढ़ने में आसान है। एक नट: मुझे लगता है कि आपने गलत "प्रकार" को बोल्ड किया: " ऑपरेंड्स में अंकगणित , गणना, या सूचक प्रकार , या std :: nullptr_t होगा।" स्पष्टता के लिए कोष्ठक जोड़ना ((अंकगणित, गणना, या सूचक) प्रकार) या (प्रकार std :: nullptr_t) देता है।

ऐसा नहीं है कि यह आपके उत्तर को बदलता है, लेकिन N3485 [over.built] / 12: पदोन्नत अंकगणितीय प्रकार एल और आर की प्रत्येक जोड़ी के लिए, फॉर्म के उम्मीदवार ऑपरेटर कार्य मौजूद हैं ... बूल ऑपरेटर <(एल, आर); - क्या आप उन नियमों को लागू करने से पहले प्रचारित तर्क भी लागू नहीं करते हैं?
च्रिस

@chris मैं उस खंड से सुपर परिचित नहीं हूं, इसलिए मुझे इसके बारे में सोचना होगा लेकिन मुझे नहीं लगता कि मैं जो देख सकता हूं उससे उत्तर बदल जाता है।
शाफिक याघमोर

हाँ, पदोन्नति या तो होने वाली पहली बात है।
क्रिस

63

बूलियन मान सामान्य पूर्णांक प्रचार के अधीन होते हैं, falseजिन्हें परिभाषित किया गया है 0और trueजैसा कि परिभाषित किया गया है 1। यह सभी तुलनाओं को अच्छी तरह से परिभाषित करता है।


2
... और संबंधपरक ऑपरेटर अंकगणितीय या गणना प्रकार के ऑपरेंड पर सामान्य अंकगणितीय रूपांतरण (जिसमें पूर्णांक पदोन्नति शामिल हैं) करने के लिए निर्दिष्ट हैं।
टीसी

5
मुझे यह पसंद है कि यह उत्तर शफीक से छोटा है, लेकिन मुझे लगता है कि मुख्य बिंदु जिसे falseपरिभाषित किया गया है 0और मानक केtrue रूप 1 में परिभाषित किया गया है (केवल सामान्य अभ्यास द्वारा) इसे वापस करने के लिए सबूत की आवश्यकता है।
केरेन

@KRyan क्या, आप इसके लिए मेरा शब्द नहीं लेने जा रहे हैं? :) इससे पहले कि एक boolप्रकार था , इससे पहले कि सी ++ भी था, एक बूलियन ऑपरेशन के परिणाम को 0गलत और 1सच के रूप में परिभाषित किया गया था । मुझे आश्चर्य नहीं होगा अगर आप इसे K + R में पा सकते हैं।
मार्क रैनसम

1
@KRyan मैं K + R से काफी पीछे नहीं जा सकता, लेकिन मैंने 1990 की ANSI C मानक की अपनी प्रति खोद ली। धारा 6.3.8 कहती है, "प्रत्येक ऑपरेटर <(इससे कम), >(अधिक से अधिक), <=(इससे कम या बराबर), और >=(अधिक से अधिक बराबर) 1 का उत्पादन करेगा यदि निर्दिष्ट संबंध सत्य है और 0 यदि यह है तो असत्य। परिणाम का प्रकार है int। "
मार्क रैनसम

1
IIRC की सबसे बड़ी समस्या यह थी कि K & R में, enum bool { false = 0, true = 1}कानूनी था लेकिन इसे परिभाषित नहीं किया गया था operator<
MSalters

22

सी ++ मानक के अनुसार (5.9 रिलेशनल ऑपरेटर)

2 सामान्य अंकगणित रूपांतरण अंकगणितीय या गणना प्रकार के ऑपरेंड पर किए जाते हैं।

तथा

1 ... परिणाम का प्रकार बूल है।

और (3.9.1 मौलिक प्रकार)

6 प्रकार के बूल के मूल्य या तो सही हैं या गलत हैं। 4 नोट [: कोई हस्ताक्षरित, अहस्ताक्षरित, लघु या लंबे बूल प्रकार या मान नहीं हैं। -एंड नोट] प्रकार बूल के मूल्य अभिन्न पदोन्नति (4.5) में भाग लेते हैं

और (4.5 इंटीग्रल प्रमोशन)

6 टाइप बूल का एक प्रचलन टाइप इंट के प्रचलन में बदला जा सकता है, जिसमें झूठ शून्य और सच्चा एक हो जाता है

तो आपके सभी उदाहरणों में सत्य को int 1 में बदल दिया जाता है और झूठ को int 0 में बदल दिया जाता है

ये भाव

false < false
false < true
true < false
true < true

के समतुल्य हैं

0 < 0
0 < 1
1 < 0
1 < 1

8

बूलियन falseके बराबर है int 0, और बूलियन trueके बराबर है int 1। तो यह बताता है कि क्यों false < true= = 0 < 1केवल एक ही है जो लौटता है true

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.