मुझे साक्षात्कार में से एक में पूछा गया था, सी में निम्नलिखित पंक्ति क्या प्रिंट करती है? मेरी राय में निम्नलिखित पंक्ति का कोई मतलब नहीं है:डबल कोट के साथ शुरू होने वाली रेखा सी में क्या मतलब है?
"a"[3<<1];
क्या किसी को इसका जवाब पता है?
मुझे साक्षात्कार में से एक में पूछा गया था, सी में निम्नलिखित पंक्ति क्या प्रिंट करती है? मेरी राय में निम्नलिखित पंक्ति का कोई मतलब नहीं है:डबल कोट के साथ शुरू होने वाली रेखा सी में क्या मतलब है?
"a"[3<<1];
क्या किसी को इसका जवाब पता है?
आश्चर्य की बात है, इसका अर्थ है: यह वर्णों की एक सरणी में एक अनुक्रमण है जो एक स्ट्रिंग अक्षर का प्रतिनिधित्व करता है। संयोग से, यह विशेष सूचकांक 6
पर है, जो शाब्दिक सीमाओं के बाहर है, और इसलिए अपरिभाषित व्यवहार है।
आप एक अभिव्यक्ति एक ही मूल पैटर्न निम्नलिखित है कि काम करता है का निर्माण कर सकते हैं:
"Hello world"[0]
'H'
है:
char c = "quick brown fox"[3 << 1];
के रूप में इस का
char c = 'b';
"कोई अर्थ नहीं है" और "अनिर्धारित व्यवहार" दो विरोधाभासी बयान नहीं हैं? – sepp2k
मुझे ऐसा नहीं लगता है। वाक्य रचनात्मक अर्थ "एक्सेस सरणी तत्व" है, और अर्थपूर्ण अर्थ "अपरिभाषित व्यवहार" है। –
Think वैसा ही प्रभाव पड़ेगा
"Hello world"
एक स्ट्रिंग अक्षर है। एक स्ट्रिंग अक्षर char
की एक सरणी है और अभिव्यक्ति में सरणी के पहले तत्व में पॉइंटर में परिवर्तित हो जाती है। "Hello world"[0]
का अर्थ सरणी का पहला तत्व है।
इसका अर्थ है। संकेत: a[b]
का अर्थ बिल्कुल *(a+b)
जैसा ही है। (मुझे नहीं लगता कि यह एक महान साक्षात्कार प्रश्न है, हालांकि।)
विशेष रूप से सवाल जो भी कोड का मतलब है, से अच्छा नहीं है, यह निश्चित रूप से * प्रिंट * कुछ भी गारंटी नहीं है। I/O फ़ंक्शंस आदि के लिए कॉल की कमी –
ओह, इसके साथ बहुत कुछ गलत है।संयोग से, मैंने अभी देखा है कि जब मैंने इस सवाल को देखा तो मैंने इसे गलत तरीके से पढ़ा और सोचा कि यह '(3 << 1) ["a"] '" [3 << 1] 'के बजाय' (3 << 1) ["a"]' के बारे में पूछ रहा था। (प्रश्नकर्ता के स्पष्ट परेशानी के कारण, जो बाद के पूर्व के लिए एक और अधिक उचित प्रतिक्रिया है।) और मैं शर्त लगाता हूं कि "रबड़ के जूते" सही रास्ते पर हैं और साक्षात्कार में वास्तव में पूछे गए सवाल में '>>' नहीं था '' <<। –
"a"
2 अक्षरों, 'a'
, और 0
की एक सरणी है। 3 << 1
3*2 = 6
है, इसलिए यह 2-तत्व सरणी के 7 वें तत्व तक पहुंचने का प्रयास कर रहा है। वह अपरिभाषित व्यवहार है।
(इसके अलावा, कोड कुछ भी मुद्रित नहीं है, भले ही अपरिभाषित व्यवहार, निकाल दिया जाता है के बाद से कोई मुद्रण कार्यों कहा जाता है।)
"some_string" [मैं] दिया स्ट्रिंग के ith चरित्र देता है। 3<<1
6 है। तो "a"[3<<1]
स्ट्रिंग "ए" के 6 वें चरित्र को वापस करने का प्रयास करता है।
दूसरे शब्दों में कोड अपरिभाषित व्यवहार का आह्वान करता है (और इस प्रकार, एक अर्थ में, वास्तव में इसका कोई मतलब नहीं है) क्योंकि यह सीमाओं से बाहर एक चार सरणी तक पहुंच रहा है।
'" का अर्थ है "'* * * एक लाइन शुरू नहीं करता है। लेकिन हाँ, चूंकि मान को त्याग दिया जाता है (जब तक कि लाइन जारी नहीं होती है) .. तो यह संभवतः केवल मूर्ख कोड है (लेकिन पिछली पंक्ति को देखें)। –
अभिव्यक्ति '(3 << 1) ["a"]' अभिव्यक्ति के समान, "ए" [3 << 1] 'अभिव्यक्ति के बाद अभिव्यक्ति होनी चाहिए। क्या आप समझ सकते हैं क्यों? यद्यपि मूल्यांकन की गई सामग्री स्पष्ट रूप से अपरिभाषित है, लेकिन यदि आप * शिफ्ट * ऑपरेटर: '" ए "[3 >> 1]', '(3 >> 1) [" a "]' (दोनों को स्विच करते हैं तो यह पूरी तरह से मान्य होगा) मान्य अभिव्यक्तियां हैं और char '\ 0' लौटाएं)। –