क्या करता है '?' C ++ में करते हैं?


80
int qempty()
{
    return (f == r ? 1 : 0);
}

उपरोक्त स्निपेट में "क्या ? " का मतलब है? हम इसे किस से बदल सकते हैं?


22
पाठ्यक्रम के इस विशेष मामले में, आप इसे रिटर्न एफ == आर के साथ बदल सकते हैं;
ग्रहण २ E

6
@ ग्रहण: यदि मैं इसे टाल सकता हूं, तो मैं एक अंतर्निहित रूपांतरण बूल पर भरोसा नहीं करूंगा।
डैनियल डारानास

2
@DanielDaranas क्यों नहीं? (यह एक तरह का शुरुआती सवाल
माइकल हॉफमैन

4
@MichaelHoffmann इस मामले में निहित रूपांतरण का व्यवहार अच्छी तरह से परिभाषित है, इसलिए इसका उपयोग करना पूरी तरह से सही है; मानक के संदर्भ के लिए इस उत्तर को देखें । व्यक्तिगत रूप से, मैं निहित प्रकार के रूपांतरणों का उपयोग करने से बचता हूं क्योंकि मुझे लगता है कि कोड अधिक पठनीय और रखरखाव योग्य है और उनके बिना त्रुटि कम है। मैंने इसके बारे में और अधिक विस्तार से इस ब्लॉग पोस्ट में लिखा है ।
डैनियल डारनास

जवाबों:


135

इसे आमतौर पर सशर्त ऑपरेटर के रूप में जाना जाता है , और जब इसे इस तरह इस्तेमाल किया जाता है:

condition ? result_if_true : result_if_false

... यदि conditionमूल्यांकन करता है true, तो अभिव्यक्ति का मूल्यांकन करता है result_if_true, अन्यथा इसका मूल्यांकन करता है result_if_false

यह सिंथेटिक चीनी है , और इस मामले में, इसे बदला जा सकता है

int qempty()
{ 
  if(f == r)
  {
      return 1;
  } 
  else 
  {
      return 0;
  }
}

नोट: कुछ लोग ?:इसे " टर्नरी ऑपरेटर " के रूप में संदर्भित करते हैं , क्योंकि यह एकमात्र टर्नरी ऑपरेटर (यानी ऑपरेटर जो उस भाषा में तीन तर्क लेता है) का उपयोग कर रहा है।


4
नियमित कोड में, यह सिंथेटिक चीनी है, लेकिन यह आपको कंस्ट्रक्शन की प्रारंभिक सूची में सशर्त आरंभीकरण करने में सक्षम बनाता है।
जॉनएमसीजी

Foo (Bar * y) pMember (y == NULL? NULL: y-> pMember) - यहां, हम pMember को y के pMember, या NULL से आरंभ करते हैं यदि यह नहीं है। कंस्ट्रक्टर इनिशियलाइजेशन में if-else नहीं डाल सकता है, इसलिए टर्नरी ऑपरेटर इसे संभव बनाता है।
जॉनएमसीजी

@ जॉनमोक्ग: खैर, सी ++ 11 में आप के लिए सिंथैटिक a? b : cशुगर पर विचार कर सकते हैं [&]() -> Type { if (a) return b; else return c; }()
celtschk

1
शायद, लेकिन सवाल, जवाब, और टिप्पणी 2009 में लिखी गई थी।
जॉनएमसीजी

15

यह एक टर्नरी ऑपरेटर है, यह मूल रूप से एक इनलाइन है यदि स्टेटमेंट

x ? y : z

जैसे काम करता है

if(x) y else z

सिवाय, आपके बयानों के बजाय भाव हैं; इसलिए आप इसे अधिक जटिल कथन के बीच में उपयोग कर सकते हैं।

यह succinct कोड लिखने के लिए उपयोगी है, लेकिन कोड को बनाए रखने के लिए कठिन बनाने के लिए इसका अत्यधिक उपयोग किया जा सकता है।


4
यह जानने के लायक है कि '?' पर एक अनुक्रम बिंदु है। इसका मतलब है कि निम्नलिखित मान्य है: ++ x? x: y;
जोहान्स शाउब -

1
@ डैनियल, यही मैं बयानों के बजाय अभिव्यक्ति होने का मतलब था। मैं शायद अंतर के बारे में पर्याप्त स्पष्ट नहीं था, इसलिए कुछ स्पष्टीकरण जोड़ने के लिए धन्यवाद।
रिचर्ड

6

आप इसे फिर से लिख सकते हैं:

int qempty(){ return(f==r);}

जो अन्य उत्तरों में कही गई बात को समान करता है।


यह बूलियन से int
डॉन चीडल

6

बस एक नोट, अगर आप कभी यह देखते हैं:

a = x ? : y;

यह मानक के लिए एक GNU एक्सटेंशन है ( https://gcc.gnu.org/oniltocs/gcc/Conditionals.html#Conditionals देखें )।

यह वैसा ही है

a = x ? x : y;

क्लांग में (कम से कम सबसे हाल के संस्करण) यह एक्सटेंशन भी उपलब्ध है। यह एक Cmake प्रोजेक्ट में बंद C ++ 11 ध्वज के साथ भी उपलब्ध है। तो इंट की तरह एक अभिव्यक्ति x = 1+1 ? : 0 ; 2 मेरे कंपाइलर में सही ढंग से रिटर्न , और इसने कुछ भी शिकायत नहीं की।
विनीसस ए। जॉर्ज


3

यह सशर्त ऑपरेटर है।

ए ? बी: सी

यह IF / THEN / ELSE का शॉर्टकट है।

का अर्थ है: यदि कोई सत्य है, तो b वापस करें, अन्यथा c वापस करें। इस स्थिति में, यदि f == r, 1 लौटाएं, तो वापसी 0 होगी।


2

प्रश्न चिह्न सशर्त संचालक है। कोड का मतलब है कि यदि f == r है तो 1 लौटाया जाता है, अन्यथा, वापसी 0. कोड को फिर से लिखा जा सकता है

int qempty()
{
  if(f==r)
    return 1;
  else
    return 0;
}

जो शायद इसे करने का सबसे साफ तरीका नहीं है, लेकिन उम्मीद है कि आपकी समझ में मदद मिलेगी।

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