2012-04-04 12 views
38

सी ++ 03 5.1 प्राथमिक भाव
§2:
स्ट्रिंग अक्षर एल-वैल्यू क्यों हैं जबकि अन्य सभी अक्षर आर-वैल्यू हैं?

एक शाब्दिक एक प्राथमिक अभिव्यक्ति है। इसका प्रकार इसके रूप (2.13) पर निर्भर करता है। एक स्ट्रिंग अक्षर एक लवल है; अन्य सभी शाब्दिक हैं।

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

लेकिन सवाल यह है कि क्यों स्ट्रिंग अक्षर वस्तुएं हैं जबकि अन्य सभी अक्षर नहीं हैं?
यह तर्क मुझे अंडे या चिकन की समस्या की तरह लगता है।

मुझे लगता है कि इसका उत्तर सी/सी ++ के बजाय प्रोग्रामिंग भाषाओं के रूप में हार्डवेयर आर्किटेक्चर से संबंधित हो सकता है, फिर भी मैं इसे सुनना चाहता हूं।

नोट: मैं के रूप में सी & C++ इस सवाल टैगिंग हूँ दोनों C99 मानक भी इसी तरह की कोटेशन, विशेष रूप से §6.5.1.4

+2

लाभाएं वस्तुएं नहीं हैं। अंतराल वे मान होते हैं जो एक असाइनमेंट के बाईं ओर दिखाई दे सकते हैं, जैसे चर, संरचनाओं के सदस्य, और सरणी तत्व लुकअप। (एल = बाएं।) – duskwuff

+6

@ डस्कवफ: समिति अलग-अलग होने की मांग करती है। प्रति 6.3.2.1, "एक अंतराल एक ऑब्जेक्ट प्रकार या शून्य के अलावा एक अपूर्ण प्रकार के साथ एक अभिव्यक्ति है; यदि कोई मूल्यांकन नहीं किया जाता है तो एक वस्तु किसी ऑब्जेक्ट को निर्दिष्ट नहीं करती है, तो व्यवहार अपरिभाषित होता है।" उस उद्धरण में संदर्भित फुटनोट (53) के अनुसार, एक आभासी को "ऑब्जेक्ट लोकेटर वैल्यू" के रूप में सोचा जाना चाहिए। –

+0

@ जॉन कॉल्सबेक सी ++ 11 'फिक्स्ड', उदा। 'उपनाम {}' अब संभव है। 'यू {} .arr' सरणी प्रकार का एक रैल्यू भी है यदि' यू' 'के लिए कक्षा परिभाषा में 'arr' घोषित किया गया है। –

उत्तर

24

एक स्ट्रिंग शाब्दिक सरणी प्रकार के साथ एक शाब्दिक है, और सी में है क्योंकि एक आभासी प्रकार के रूप में एक अभिव्यक्ति में मौजूद एक सरणी प्रकार के लिए कोई रास्ता नहीं है। स्ट्रिंग अक्षर को "सामग्री" स्ट्रिंग पर इंगित करने वाले पॉइंटर प्रकार (सरणी प्रकार के बजाय आमतौर पर एक पॉइंटर को क्षय) के लिए निर्दिष्ट किया जा सकता था, लेकिन इससे उन्हें कम उपयोगी बना दिया जाएगा; विशेष रूप से, sizeof ऑपरेटर उन्हें लागू नहीं किया जा सका।

ध्यान दें कि सी 99 ने यौगिक अक्षर तैयार किए हैं, जो कि भी अंतराल हैं, इसलिए एक शाब्दिक होना एक लवल्यू होना अब एक विशेष अपवाद नहीं है; यह आदर्श होने के करीब है।

+0

'डालता है ("हैलो")' एक सरणी प्रकार के साथ अभिव्यक्ति का एक उदाहरण नहीं है जो एक रावल्यू हो सकता है? – Pubby

+1

'डालता है (" हैलो ") 'टाइप' int' के साथ एक अभिव्यक्ति है। –

+0

मेरा मतलब था कि "हैलो" एक रावल्यू है। – Pubby

6

मुझे लगता है कि मूल उद्देश्य मुख्य रूप से एक व्यावहारिक था: एक स्ट्रिंग शाब्दिक स्मृति में रहना चाहिए और एक पता होना चाहिए। स्ट्रिंग शाब्दिक प्रकार का एक सरणी प्रकार (सी सी, char const[] सी ++ में) है, और सरणी प्रकार अधिकांश संदर्भों में पॉइंटर्स में कनवर्ट करते हैं। भाषा को परिभाषित करने के अन्य तरीकों को मिला है (उदाहरण के लिए एक स्ट्रिंग शाब्दिक पॉइंटर प्रकार के साथ शुरू हो सकता है, जिसमें की ओर इशारा करते हुए विशेष नियम हैं), लेकिन केवल शाब्दिक एक लवल बनाना संभवतः का सबसे आसान तरीका है परिभाषित करने के लिए क्या जरूरत है परिभाषित करना।

+0

क्यों निश्चित रूप से सही उत्तर के लिए नीचे वोट? –

+0

मेरा डाउनवोट नहीं। इसलिए यदि मैं आपके उत्तर को सही ढंग से समझता हूं, तो समिति ने स्वीकार किया कि संभवत: यह संभवतः सुझाव दिया गया था कि यह संभवतः सबसे अच्छा संभव दृष्टिकोण था या नहीं, लेकिन उस समय चुनने के लिए यह अधिक लचीला लग रहा था? –

+0

जो भी इसके लायक है, सी 99 मानक ने केवल सी 8 9 मानक से पाठ लिया, और सी 8 9 मानकीकरण प्रक्रिया में, जैसा कि मुझे याद है (मिनट पढ़ने से, मैं कभी भी वास्तविक मीटिंग में नहीं था) इसके बारे में कुछ मामूली तर्क था लेकिन यह कहीं भी नहीं गए। स्ट्रिंग अक्षर 'कॉन्स' बनाने के बारे में बड़े आग्रह के तर्क थे। – torek

7

सी ++ में एक अंतराल हमेशा किसी ऑब्जेक्ट को संदर्भित नहीं करता है। यह एक समारोह को भी संदर्भित कर सकता है। इसके अलावा वस्तुओं को lvalues ​​द्वारा संदर्भित नहीं किया जाना चाहिए। उन्हें सरणी (सी ++ और सी में) सहित रावलों द्वारा संदर्भित किया जा सकता है। हालांकि पुराने सी 8 9 में, पॉइंटर रूपांतरण के लिए सरणी रावलस सरणी के लिए लागू नहीं हुई थी।

अब, एक रैल्यू नो, सीमित या जल्द ही समाप्त होने वाले जीवनकाल को दर्शाता है। एक स्ट्रिंग शाब्दिक हालांकि पूरे कार्यक्रम के लिए रहता है।

तो स्ट्रिंग अक्षर लेवलस बिल्कुल सही है।

+0

अभिन्न साक्षरता के जीवनकाल के बारे में कैसे? और अगर कोई उनका पता नहीं लिया जा सकता है तो कोई उन्हें कैसे संदर्भित करेगा? –

+2

पूर्णांक अक्षर किसी ऑब्जेक्ट को संदर्भित नहीं करते हैं इसलिए विचार करने के लिए कोई जीवनकाल नहीं है। –

7

स्ट्रिंग अक्षर सरणी - स्वाभाविक रूप से अप्रत्याशित आकार (यानी उपयोगकर्ता द्वारा परिभाषित और संभवतः बड़े आकार के) की वस्तुएं हैं। सामान्य स्थिति में स्मृति में ऑब्जेक्ट्स को छोड़कर, इस तरह के अक्षर का प्रतिनिधित्व करने का कोई अन्य तरीका नहीं है, यानी अंतराल के रूप में।सी 99 में यह यौगिक अक्षर पर भी लागू होता है, जो भी अंतराल हैं।

कृत्रिम रूप से इस तथ्य को छिपाने का कोई प्रयास है कि स्ट्रिंग अक्षर भाषा स्तर पर अंतराल हैं, जो पूरी तरह से अनावश्यक कठिनाइयों का उत्पादन करेंगे, क्योंकि एक सूचक के साथ एक स्ट्रिंग अक्षर को इंगित करने की क्षमता के साथ-साथ इसे एक्सेस करने की क्षमता क्योंकि एक सरणी भाषा स्तर पर दिखाई देने वाले अपने लवल्यू-नेस पर गंभीर रूप से निर्भर करती है।

इस बीच, स्केलर प्रकारों के अक्षर ने संकलन-समय आकार तय कर दिया है। साथ ही इस तरह के अक्षर भी दिए गए हार्डवेयर आर्किटेक्चर पर सीधे मशीन कमांड में एम्बेडेड होने की संभावना है। उदाहरण के लिए, जब आप i = i * 5 + 2 जैसे कुछ लिखते हैं, तो शाब्दिक मान 5 और 2 जेनरेट किए गए मशीन कोड के स्पष्ट (या यहां तक ​​कि निहित) भाग बन जाते हैं। वे मौजूद नहीं हैं और डेटा संग्रहण में स्टैंडअलोन स्थानों के रूप में मौजूद होने की आवश्यकता नहीं है। डेटा मेमोरी में मूल्य 5 और 2 को संग्रहीत करने में कोई मतलब नहीं है।

यह भी कुछ भी मूल्यवान नहीं है कि कई (यदि अधिकतर नहीं, या सभी) हार्डवेयर आर्किटेक्चर फ्लोटिंग-पॉइंट लिटरल वास्तव में "छिपे हुए" अंतराल के रूप में कार्यान्वित किए जाते हैं (भले ही भाषा उन्हें इस तरह प्रकट न करे)। फ्लोटिंग-पॉइंट समूह से x86 मशीन कमांड जैसे प्लेटफ़ॉर्म पर एम्बेड किए गए तत्काल ऑपरेशंस का समर्थन नहीं करते हैं। इसका मतलब यह है कि लगभग हर फ़्लोटिंग-पॉइंट शाब्दिक को संकलक द्वारा डेटा मेमोरी (और पढ़ा जाता है) में संग्रहीत किया जाना चाहिए। जैसे जब आप i = i * 5.5 + 2.1 की तरह कुछ लिखने ऐसा

const double unnamed_double_5_5 = 5.5; 
const double unnamed_double_2_1 = 2.1; 
i = i * unnamed_double_5_5 + unnamed_double_2_1; 

दूसरे शब्दों में कुछ में अनुवादित किया गया फ्लोटिंग प्वाइंट शाब्दिक अक्सर आंतरिक रूप से बनने "अनाधिकारिक" lvalues ​​अंत। हालांकि, यह सही समझ में आता है कि भाषा विनिर्देश ने इस कार्यान्वयन के विस्तार को बेनकाब करने का कोई प्रयास नहीं किया है। भाषा स्तर पर अंकगणितीय अक्षर रावल के रूप में अधिक समझ में आता है।

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