2012-04-13 13 views
35

आमतौर पर '?' ऐसे मामलों में जहां बी = एक मैं निम्नलिखित संक्षिप्त नामसी सशर्त ऑपरेटर ('?') खाली दूसरे पैरामीटर के साथ

A ? : C 

यह आश्चर्यजनक रूप से काम करता है देखा है में

A ? B : C 

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

+0

सिंटैक्स की तरह [ग्रोवी] (http://en.wikipedia.org/wiki/Groovy_%28programming_language%29) की तरह दिख रहे हैं। – Lion

उत्तर

32

भाषा सी (जहां तक ​​मुझे पता है) द्वारा इसकी अनुमति नहीं है, लेकिन जीसीसी जैसे कंपाइलर्स में शॉर्टकट है?: C extension के रूप में। a?:c का अर्थ a?a:c जैसा है।

+18

इसका मतलब है ... चेतावनी के साथ कि 'ए' में साइड इफेक्ट्स नहीं हैं। 'ए?: सी 'केवल एक बार' ए 'निष्पादित करता है, जबकि' ए? ए: सी 'दो बार' ए' के दुष्प्रभाव निष्पादित करेगा। –

3

जब तक कि मैं बुरी गलती नहीं करता, आप एक कंपाइलर एक्सटेंशन (अनुमान पर, gcc) का उपयोग कर रहे हैं। मुझे पूरा यकीन है कि मानक आपको तीसरे ऑपरेंड को टर्नरी ऑपरेटर को छोड़ने की अनुमति देता है।

16

यह एक जीसीसी के विस्तार

Conditionals with Omitted Operands

x ? : yx ? x : y

+2

वह पेज जो आपने स्वयं से विरोधाभास से जुड़ा हुआ है। एक ओर यह कहता है "यह उदाहरण पूरी तरह से' x? X: y' "के बराबर है, जिसका अर्थ है कि 'x' का मूल्यांकन दो बार किया जाता है, लेकिन दूसरी तरफ अंतिम अनुच्छेद बताता है कि' x' का मूल्यांकन केवल एक बार किया जाएगा, जो इसे 'x || के बराबर समकक्ष बना देगा वाई', नहीं 'एक्स? x: y' – Celada

+1

@ सेलाडा: मुझे लगता है कि इसका मतलब है कि 'x? : y' ** लगभग ** x के बराबर है? x: y' को छोड़कर 'x' को पूर्व मामले में केवल एक बार मूल्यांकन किया जाता है। –

+3

@ सेलाडा: 'x || y' 0 या 1 का मूल्यांकन करता है जो इस ऑपरेटर के साथ मामला नहीं है। –

0

यह में दूसरा पैरामीटर छोड़ने के लिए बेहतर है के बराबर है। बी कभी बदलता है, तो आप उपरोक्त कथन को संशोधित करने के याद नहीं रख सकते । इसके अलावा, अगर आप बयान से बाहर निकलते हैं तो अन्य लोगों को आपके कोड को पढ़ने में कठिनाई हो सकती है और उस पर सुधार हो सकता है।

1

मैं वेब में एक छोटे से अनुसंधान किया, विकिपीडिया के अनुसार, इस व्यवहार सी http://en.wikipedia.org/wiki/%3F:#C

की एक जीएनयू विस्तार के द्वारा समर्थित है इसलिए यह बहुत संभव है कि अन्य compilers इस अवैध मानते हैं। वैसे, इस ऑपरेटर को टर्नरी सशर्त कहा जाता है ताकि आप इसके बारे में ब्राउज़ कर सकें।

संपादित करें:

मैं में जीसीसी और सेब LLVM की जाँच की और यह ठीक काम करता है।

3

मैं थोड़ा सा भरता हूं।

मानक सशर्त ऑपरेटर शब्द का उपयोग करता है।

Syntax 
    conditional-expression: logical-OR-expression logical-OR-expression? expression : conditional-expression 

सशर्त अभिव्यक्ति एक lvalue उपज नहीं है। इसके अलावा; Wikipedia; Conditional

नोट: यानी .: सी ++ है:
        तार्किक या अभिव्यक्ति?अभिव्यक्ति: काम -expression

Constraints: 
* The first operand shall have scalar type[1]. 
* One of the following shall hold for the second and third operands: 
    — both operands have arithmetic type[2]; 
    — both operands have the same structure[3] or union type[4]; 
    — both operands have void type[5]; 
    — both operands are pointers to qualified or unqualified[6] versions of compatible 
    types[7]; 
    — one operand is a pointer and the other is a null pointer constant[8]; or 
    — one operand is a pointer to an object or incomplete type[9] and the other 
    is a pointer to a qualified or unqualified version of void. 

फुट भोजन:

[1] Scalar type  : Arithmetic types and pointer types. 
[2] Arithmetic type : Integer and floating types. 
[3] Structure type : A sequentially allocated nonempty set of member objects (and, in 
        certain circumstances, an incomplete array), each of which has an 
        optionally specified name and possibly distinct type. 
[4] Union type  : An overlapping nonempty set of member objects, each of which has 
        an optionally specified name and possibly distinct type. 
[5] Void type  : An empty set of values; it is an incomplete type that cannot be 
        completed. 
[6] Qualified type : 1998 (const and volatile), 1999 (restrict), respectively 
        2011 (_Atomic). * 
[7] Compatible type : Their types are the same. 
[8] Null ptr. const.: NULL; implementation-defined null pointer constant. 
[9] Incomplete type : Types that describe objects but lack information needed to determine 
         their sizes. 

*Type qualifiers in C

तो: उपयोग करने के लिए बुद्धिमान नहीं।

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