8

क्या यह एक वैध अभिव्यक्ति है? यदि हां, तो क्या आप इसे फिर से लिख सकते हैं ताकि यह अधिक समझ में आता है? उदाहरण के लिए, क्या यह (4 > y && y > 1) जैसा ही है? आप जंजीर लॉजिकल ऑपरेटरों का मूल्यांकन कैसे करते हैं?क्या है (4> वाई> 1) सी ++ में एक वैध कथन? यदि आप ऐसा करते हैं तो आप इसका मूल्यांकन कैसे करते हैं?

+0

संभावित डुप्लिकेट [श्रृंखलित तुलना ऑपरेटरों के लिए भाषा समर्थन (एक्स

उत्तर

18

बयान (4 > y > 1) इस रूप में पार्स किया जाता है:

((4 > y) > 1) 

तुलना ऑपरेटरों < और >evaluate left-to-right

4 > y या तो 0 या 1 देता है यदि यह सत्य है या नहीं।

फिर परिणाम 0 या 1 के बाद से करने के लिए 1.

इस मामले में, तुलना की जाती है पूरे बयान हमेशा गलत वापस आ जाएगी 1 से अधिक कभी नहीं है।


एक अपवाद है, हालांकि नहीं है:

तो y एक वर्ग है और > ऑपरेटर कुछ असामान्य करने के लिए अतिभारित किया गया है। फिर कुछ भी चला जाता है।

उदाहरण के लिए, इस संकलन विफल हो जाएगा:

class mytype{ 
}; 

mytype operator>(int x,const mytype &y){ 
    return mytype(); 
} 

int main(){ 

    mytype y; 

    cout << (4 > y > 1) << endl; 

    return 0; 
} 
+5

तकनीकी रूप से, '4> y' या तो 'झूठी' या 'सत्य' देता है, जो अगली तुलना के लिए '0' या' 1' में परिवर्तित हो जाते हैं। – fredoverflow

2

4> y सत्य या गलत के बुलियन मूल्य का मूल्यांकन करेगा। अभिव्यक्ति का शेष तब अनिवार्य रूप से [सत्य | झूठा]> 1 है, जो समझ में नहीं आता है।

+0

यह "समझ में आता है" जब आपको एहसास होता है कि 'सत्य' और 'झूठा' सी/सी ++ में पूर्णांक मान हैं। –

+2

टेड: नहीं वे नहीं हैं। हालांकि, उन्हें और से परिवर्तित किया जा सकता है। – GManNickG

+0

@Gman: एक तकनीकीता, लेकिन एक प्रासंगिक एक। अर्थशास्त्र क्रूर हो सकता है। –

4

मुझे लगता है कि यह एक वैध अभिव्यक्ति (नहीं एक बयान) है, लेकिन शायद आप क्या चाहते हैं नहीं करता है। यह (4 > y) > 1 के रूप में बाएं से दाएं का मूल्यांकन करता है। परीक्षण 4 > y या तो 0 (झूठी) या 1 (सत्य) का मूल्यांकन करेगा, और पूरी अभिव्यक्ति हमेशा 0 (झूठी) का मूल्यांकन करेगी।

4

अभिव्यक्ति वैधता

हाँ, यह एक वैध अभिव्यक्ति, यह मानते हुए y है, या परोक्ष में, एक पूर्णांक परिवर्तित किया जा सकता है। यदि यह नहीं है और > ऑपरेटर ओवरलोड हो गया है, तो यह इस प्रश्न के दायरे से बाहर एक अलग कहानी है।

इसका मूल्यांकन ((4 > y) > 1) के रूप में बाएं से दाएं किया जाएगा।

मान लीजिए y एक पूर्णांक है, आइए दो संभावनाओं पर विचार करें। 4 > ytrue या false वापस कर सकते हैं। अगला भाग प्रभावी रूप से true > 1 या false > 1 बन जाता है। ए) 4 > y रिटर्न true:

को देखते हुए निहित bool to int conversion, वहाँ दो संभावनाएं हैं। true1 का मूल्यांकन करता है। 1 > 1 झूठे का मूल्यांकन करता है। बी) 4 > yfalse देता है। false0 का मूल्यांकन करता है। 0 > 1 झूठे का मूल्यांकन करता है।

कोई फर्क नहीं पड़ता कि अभिव्यक्ति झूठी मूल्यांकन करेगी।

फिर से लिखा व्याख्या

मुझे लगता है कि तुम क्या करना चाहते हैं ((4 > y) && (y > 1)) है।

उदाहरण

(4 > y > 1)(4 > y && y > 1) के रूप में ही नहीं है।

तार्किक ऑपरेटर्स

तार्किक ऑपरेटरों (!, &&, ||) शॉर्ट-सर्किट तर्क का उपयोग करें।

a && b, a का मूल्यांकन किया जाएगा। यदि a सत्य का मूल्यांकन करता है, तो b का मूल्यांकन किया जाएगा। अन्य, b का मूल्यांकन नहीं किया जाएगा। a || b के लिए, शॉर्ट-सर्किटिंग तर्क रिवर्स में काम करता है। a का मूल्यांकन किया जाएगा। चूंकि अभिव्यक्ति a का मूल्यांकन पहले किया जाता है, यदि यह गलत है, तो कोई संभावना नहीं है कि संपूर्ण अभिव्यक्ति सत्य का मूल्यांकन करेगी।

a || b, a दिया गया मूल्यांकन किया जाएगा। यदि a गलत पर मूल्यांकन करता है, तो b का मूल्यांकन किया जाएगा। अन्य, b का मूल्यांकन नहीं किया जाएगा। चूंकि अभिव्यक्ति a का मूल्यांकन पहले किया जाता है, यदि यह सत्य है, तो कोई संभावना नहीं है कि संपूर्ण अभिव्यक्ति झूठी मूल्यांकन करेगी।

ऑपरेटरों को चेन करना operator precedence का मामला है। ब्रांड्स का उपयोग करने के लिए बेहतर है और गलत व्यवहार को जोखिम देने के बजाय स्पष्ट होना चाहिए।

-1

4> वाई> 1 -> वाई हो सकता है अगर वाई - कक्षा है !!

#include <iostream> 
#include <string> 

struct num{ int n; }; 

struct op{ bool v; struct num n; }; 

struct op operator > (int x, num n){ 
    struct op o = { x > n.n, n }; 
    return o; 
} 
bool operator > (struct op o, int x) 
{ 
    return o.v && o.n.n > x; 
} 

int main() 
{ 


    struct num y = { 2 } ; 
    if ( 4 > y > 1) { std::cout << "4 > y > 1 TRUE" << std::endl; } 
    else { std::cout << "4 > y > 1 ALWAYS FALSE" << std::endl; } 
} 
की
संबंधित मुद्दे

 संबंधित मुद्दे