2013-06-04 16 views
5

जीसीसी एक awesome ternary expression extension to C जो इस तरह एक बयान बनाने के लिए हमें की अनुमति देता है:जीसीसी का टर्नरी एक्सटेंशन समर्थन असाइनमेंट क्यों नहीं करता है?

int x = some_var ?: 10; // expands to some_var ? some_var : 10 

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

x = x + 2; 

// instead, we can say 
x += 2; 

सबसे द्विआधारी सी ऑपरेटरों (+, -, *, / के लिए आदर्श, %, |, &, ^), क्यों इस त्रिगुट विस्तार ऑपरेटर के लिए मामला नहीं है:

int x = ...; 
x ?:= 2; // error: Expected expression before '=' token 

// which would expand to 
x = x ?: 2; 

केवल ऑपरेटरों जो नहीं है मानक सी में इसका समर्थन लॉजिकल ऑपरेटर (||, &&) है, जो निश्चित रूप से टर्नरी नहीं आती है, तो हम ऐसा क्यों नहीं कर सकते?

मैं वास्तव में अपने कोड में एक शांत बाल-डू के साथ एक स्माइली चेहरे बनाना चाहता हूं, लेकिन मैं नहीं कर सकता! क्या यह ऑपरेटर को डिजाइन करने, या जानबूझकर और कहीं भी दस्तावेज करने में एक निरीक्षण था? क्या यह ऑपरेटर का ऑपरेटर कमांड सर्किट का परिणाम है, या पूरी तरह से कुछ और?

+0

सुनिश्चित नहीं है कि 'x?: = 2; 'मतलब होगा, लेकिन शायद' x?= ValueWhenXTrue: ValueWhenXFalse; '। – chux

+1

मैं यह देखने में असफल रहा कि यह प्रश्न 'रचनात्मक नहीं' है। यह पूरी तरह से विषय पर है, जीएनयू सी में एक विशिष्ट ऑपरेटर के व्यवहार पर चर्चा कर रहा है। यह ठीक से टैग किया गया है, सरल, ठोस उदाहरण दे रहा है, और इसका एक निश्चित उत्तर है। –

+0

@chux मानव बोलने में, इसका मतलब यह होगा कि यदि x शून्य है, तो इसे 2' पर सेट करें। –

उत्तर

6

प्रश्न का उत्तर देने के लिए, मेरा मानना ​​है कि कुछ अन्य प्रश्न भी हैं जिन्हें उत्तर देने की आवश्यकता है।

क्यों सी भाषा में एक ?: ऑपरेटर है और क्यों यह बेहतर if-else से है?

जहां तक ​​मुझे पता है, कोई भी उस प्रश्न का उत्तर देने में सक्षम नहीं है, केवल अपनी व्यक्तिगत राय बताए बिना। के & आर 2.11 बताता है कि

"सशर्त अभिव्यक्ति अक्सर संक्षिप्त कोड की ओर ले जाती है।"

और फिर वे लाइन

printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' '); 

जो अपने ही व्यक्तिपरक, मैला राय है के साथ इस उदाहरण देकर स्पष्ट करना। व्यक्तिगत रूप से, मुझे विश्वास है कि

printf("%6d", a[i]); 

if(i%10==9 || i==n-1) 
    printf("\n"); 
else 
    printf(" "); 

, के रूप में 1 मिनट के लिए विरोध पढ़ सकते हैं और कश्मीर & आर संस्करण को समझने के लिए अब तक, अब तक स्पष्ट है के बाद से मैंने पढ़ा है और 10 सेकंड में है कि कोड को समझ सकता हूँ। साथ ही, मेरा कोड असंबद्ध मुद्रण को असंबद्ध स्वरूपण से अलग करता है। लेकिन निश्चित रूप से, यह है व्यक्तिपरक राय, कोई स्पष्ट अधिकार या गलत नहीं है।

आधिकारिक स्रोतों के लिए, सी 99 तर्क संस्करण 5.10, 6.5.15 वास्तव में उल्लेख नहीं करता है कि क्यों: ऑपरेटर की आवश्यकता है।यह मुख्य रूप से सिर्फ कहा गया है कि ऑपरेटर के व्यवहार नए मानक में बदल दिया गया है:

सशर्त ऑपरेटर के बीच संकार्य पर वाक्यात्मक प्रतिबंध सिर्फ तार्किक या अभिव्यक्ति की तुलना में अधिक शामिल करने के लिए ढील दिया है : इस अभ्यास के कई मौजूदा कार्यान्वयन ने अपनाया है।

एक सशर्त ऑपरेटर अभिव्यक्ति का प्रकार शून्य हो सकता है, संरचना, या संघ; अधिकांश अन्य ऑपरेटर ऐसे प्रकारों से निपटते नहीं हैं। पॉइंटर और पूर्णांक के बीच संतुलन प्रकार के नियमों में हालांकि, कड़ा कर दिया गया है, क्योंकि अब केवल स्थिर 0 0 सूचकांक एक सूचक के लिए मजबूर हो सकता है।

तो अगर किसी को संरचना या संघ के प्रकार पर अंकगणित करने का आग्रह है, तो?: माना जाता है कि यह और अधिक आसान है। मुझे इससे कोई स्पष्ट लाभ नहीं दिखता है, लेकिन कम से कम यह ऑपरेटर के अस्तित्व के लिए कुछ कारण है।

अगले प्रश्न तो होगा:

क्यों जीसीसी संकलक में ?: संकार्य के लिए एक संकलक विस्तार है?

इसका जवाब here उल्लेख किया गया है:

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

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

तो मूल सवाल का जवाब देने का प्रयास करने के:

क्यों नहीं जीसीसी के त्रिगुट विस्तार समर्थन काम?

शायद इसलिए कि किसी असाइनमेंट स्थिति में लाल्व तक पहुंचने से आम तौर पर कोई अवांछित साइड इफेक्ट नहीं मिलता है। x = x ? : 2; में केवल अवांछित दुष्प्रभाव होंगे यदि एक्स को volatile के रूप में घोषित किया गया था - एक अस्थिर चर पढ़ने को एक दुष्प्रभाव है। तो x ?:= 2; के साथ मैं देख सकता हूं कि एकमात्र व्यावहारिक उपयोग किसी भी सशर्त अभिव्यक्ति में दो बार एक ही अस्थिर चर का उपयोग करने से रोकने के लिए होगा।

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

न ही किसी भी आधिकारिक या कैनोलिक स्रोतों को मैं किसी भी उपयोग के बारे में बता सकता हूं?: ऑपरेटर स्वयं, पारंपरिक और व्यक्तिपरक कोडिंग शैली वरीयताओं के अलावा।

+1

असामान्य रूप से, हम समझौते में हैं ;-) के एंड आर एक उदाहरण का उपयोग कर पैर में खुद को शूट करने में कामयाब रहे जो शायद विकल्प से कम स्पष्ट है। '?: 'वास्तव में कोड को अधिक संक्षिप्त और स्पष्ट कर सकता है - उनका उदाहरण हालांकि उनमें से एक नहीं है! ऑपरेटर एक अभिव्यक्ति के उपयोग की अनुमति देता है जहां नियंत्रण प्रवाह अन्यथा आवश्यक होगा - और यह कभी-कभी उपयोगी होता है। – Clifford

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