2012-06-08 7 views
14

जीसीसी में, मैं foo ? : bar लिख सकता हूं जो foo ? foo : bar का एक लघुरूप रूप है लेकिन मुझे लगता है कि के & आर इसका उल्लेख नहीं करता है।सी में, जब सशर्त "परीक्षण?: Alt" फॉर्म (खाली सत्य मामला) समर्थित है?

क्या कुछ ऐसा है जो मुझे कुछ मानक में परिभाषित किया जाना चाहिए? या सिर्फ एक (बुराई) जीसीसी विस्तार से बचना चाहिए?

+2

यह एक बुरा जीसीसी विस्तार है जिसे आपको टालना चाहिए। – Lundin

+0

मुझे नहीं पता कि हर कोई इस एक्सटेंशन से नफरत क्यों करता है। यह बहुत संक्षेप में है और अक्सर इसका मतलब है कि मेरा क्या मतलब है। मेरी इच्छा है कि इसे मानक में जोड़ा जाएगा। हालांकि, ऐसा नहीं है कि आप इसका उपयोग नहीं करना चाहिए यदि आप कंप्यूटर्स के साथ अन्य जीसीसी और क्लैंग के साथ संगतता चाहते हैं। –

उत्तर

14

यह एक जीसीसी विस्तार नाम से है।

यह मानक c.Using -pedantic संकलन के लिए ध्वज आपको बताएगा।

एक सशर्त अभिव्यक्ति में मध्य संचालन छोड़ा जा सकता है। फिर यदि पहला ऑपरेंड nonzero है, तो इसका मान सशर्त अभिव्यक्ति का मूल्य है।

इसलिए, अभिव्यक्ति

    x ? : y

कि अगर अशून्य है x का मान है; अन्यथा, वाई का मूल्य।

यह उदाहरण पूरी तरह से

    x ? x : y

इस सरल मामले में के बराबर है, मध्यम संकार्य छोड़ करने की क्षमता विशेष रूप से उपयोगी नहीं है। जब यह उपयोगी हो जाता है तब पहला ऑपरेंड करता है, या (यदि यह एक मैक्रो तर्क है), तो एक दुष्प्रभाव होता है। फिर बीच में ऑपरेंड दोहराना दो बार साइड इफेक्ट करेगा। मध्य ऑपरेंड को छोड़कर पहले से गणना किए गए मान का उपयोग पुन: कंप्यूटिंग के अवांछनीय प्रभावों के बिना किया जाता है।

यह कुछ मैं पर भरोसा करना चाहिए, कुछ मानक में परिभाषित है? या सिर्फ एक (बुराई) जीसीसी विस्तार से बचना चाहिए? अपने कोड does'nt तो आप इसका इस्तेमाल कर सकते हैं किसी भी अन्य संकलक जीसीसी के अलावा अन्य कार्यान्वयन पर चलाने के लिए की जरूरत है

, अपनी आवश्यकताओं पर निर्भर करता है।हालांकि, यदि आपका कोड विभिन्न अन्य कंपाइलर कार्यान्वयनों पर निर्माण करना है तो आपको इसका उपयोग नहीं करना चाहिए।

किसी भी तरह, किसी को जितना संभव हो उतना सहज और पठनीय कोड लिखना चाहिए, क्योंकि मैं हमेशा इस तरह से (बदसूरत) से बचने का सुझाव दूंगा।

+2

धन्यवाद। मुझे लगता है कि मैं इसका इस्तेमाल करना बंद कर दूंगा। – blueshift

1

यह एक विस्तार जीसीसी में शामिल है।

यह काम नहीं करेगा यदि किसी अन्य कंपाइलर (जो उस एक्सटेंशन का समर्थन नहीं करता है) के साथ संकलित करते हैं।

तो मैं इस प्रकार के शॉर्टकट का उपयोग करने से बचने की सलाह दूंगा।

संपादित करें: जैसा कि @ केविनकॉक्स ने बताया, यहां तक ​​कि DEFINE काम नहीं करेगा (नीचे दूसरी टिप्पणी देखें)।

+0

यह _will_ काम नहीं करता है, मैंने कभी भी ऐसी (बेकार) सुविधा को लागू करने वाले किसी भी अन्य कंपाइलर के बारे में नहीं सुना है। – Lundin

+0

यह सुविधा ** ** मैक्रो के माध्यम से ** ठीक से कार्यान्वित नहीं किया जा सकता है। '# परिभाषित करें या (ए, बी) ((ए)? (ए) :(बी)) 'गलत है क्योंकि यह दो बार' ए' का मूल्यांकन कर सकता है। इसे एक (इनलाइन) फ़ंक्शन के माध्यम से भी लागू नहीं किया जा सकता है क्योंकि इसे सामान्य होना होगा। –

4

यह एक जीसीसी विस्तार है। यह सी मानक का हिस्सा नहीं है, लेकिन जीसीसी कंपाइलर आपको इसका उपयोग करने देता है। विवरण के लिए documentation देखें, और "समकक्ष" टर्नरी अभिव्यक्ति के अपने व्यवहारिक मतभेदों से सावधान रहें।
Conditionals with Omitted Operands:

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