प्रश्न का उत्तर देने के लिए, मेरा मानना है कि कुछ अन्य प्रश्न भी हैं जिन्हें उत्तर देने की आवश्यकता है।
क्यों सी भाषा में एक ?:
ऑपरेटर है और क्यों यह बेहतर 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;
के साथ मैं देख सकता हूं कि एकमात्र व्यावहारिक उपयोग किसी भी सशर्त अभिव्यक्ति में दो बार एक ही अस्थिर चर का उपयोग करने से रोकने के लिए होगा।
और यह बहुत संकीर्ण और सीमित मूल्य की एक विशेषता है। यह शायद कुछ विशेष एम्बेडेड सिस्टम मामले में उपयोगी होगा जहां आप एक वास्तविक रीयल-टाइम सिस्टम में हार्डवेयर रजिस्टरों को पढ़ते हैं ... इसके अलावा, मुझे इसके लिए कोई उपयोग नहीं दिखता है।
न ही किसी भी आधिकारिक या कैनोलिक स्रोतों को मैं किसी भी उपयोग के बारे में बता सकता हूं?: ऑपरेटर स्वयं, पारंपरिक और व्यक्तिपरक कोडिंग शैली वरीयताओं के अलावा।
सुनिश्चित नहीं है कि 'x?: = 2; 'मतलब होगा, लेकिन शायद' x?= ValueWhenXTrue: ValueWhenXFalse; '। – chux
मैं यह देखने में असफल रहा कि यह प्रश्न 'रचनात्मक नहीं' है। यह पूरी तरह से विषय पर है, जीएनयू सी में एक विशिष्ट ऑपरेटर के व्यवहार पर चर्चा कर रहा है। यह ठीक से टैग किया गया है, सरल, ठोस उदाहरण दे रहा है, और इसका एक निश्चित उत्तर है। –
@chux मानव बोलने में, इसका मतलब यह होगा कि यदि x शून्य है, तो इसे 2' पर सेट करें। –