0 एक दशमलव शाब्दिक या एक अष्टक शाब्दिक है?


329

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

है 0एक अष्टाधारी शाब्दिक सी ++ व्याकरण के अनुसार? मानक क्या कहता है?

Permissions मुझे पता है कि केवल वास्तविक उपयोग यूनिक्स फ़ाइल अनुमतियों के लिए है।


6
क्या यह जावा के लिए समान है?
फिलिप

80
+1 एक पूरी तरह से अप्रासंगिक सवाल पूछने और upvotes के टन पाने के लिए :-)
केरेक एसबी

64
मुझे लगता है कि एसओ को तत्काल निरस्त करने का तरीका कोई गहरा सवाल नहीं है, बल्कि एक अजीब सवाल है जिसका जवाब आपको वाटर कूलर पर मिलेगा। :)
जोश

4
बहुत बढ़िया सवाल :) मैंने इसे जावा लैंग्वेज स्पेस में देखा , और जावा में यह दशमलव है। यहां तक ​​कि कल्पना में निम्नलिखित उद्धरण शामिल हैं: ध्यान दें कि ऑक्टल अंकों में हमेशा दो या अधिक अंक होते हैं; 0 को हमेशा दशमलव अंक माना जाता है - ऐसा नहीं है कि यह संख्या में बहुत अधिक मायने रखता है, अंकों के लिए 0, 00 और 0x0 सभी बिल्कुल एक ही पूर्णांक मान का प्रतिनिधित्व करते हैं।
टोबियास रिट्जाउ

14
मैं लगभग एक उत्तर पोस्ट करने के लिए ललचा गया हूं जो कहता है "हां, 0 एक दशमलव शाब्दिक या एक अष्टक शाब्दिक है।"
कीथ थॉम्पसन

जवाबों:


296

हाँ, 0 C ++ में एक ऑक्टल शाब्दिक है।

C ++ मानक के अनुसार:

2.14.2 पूर्णांक शाब्दिक [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
दूसरा महत्वपूर्ण बिंदु यह है कि दशमलव-शाब्दिक एक गैर-अंकीय संख्या है जिसके बाद शून्य या अधिक अंक होता है ताकि कोई अस्पष्टता न हो।
सीबी बेली

3
@MSalters: आपके संस्करण के साथ, आपको वरीयता को अतिरिक्त रूप से निर्दिष्ट करना होगा: यदि दोनों octal-literal और decimal-literalबाइट पैटर्न की संभावित व्याख्याएं हैं, तो चुनें octal-literal। आधिकारिक मानक के शब्दों में यह समस्या नहीं है।
मार्टिन सोजका

23
@MSalters: आप अभी भी दशमलव-शाब्दिक अंकों की किसी भी संख्या के रूप में नहीं कर सकते हैं , यह एक शून्य या एक गैर-शून्य अंकों के बाद किसी भी अंक का होना चाहिए अन्यथा हर अष्टक शाब्दिक को दशमलव शाब्दिक के रूप में व्याख्या किया जा सकता है। मैं संकलन त्रुटि देख सकता हूं, अब ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate:।
CB बेली

3
@MSalters आपके उदाहरण में, 0123 ऑक्टल-शाब्दिक और दशमलव-शाब्दिक दोनों से मेल खाता है, लेकिन इसके अलग-अलग अर्थ होंगे।
शराबी

5
@CharlesBailey - एफटीएफवाई, 1अभी भी अष्टक और सभी के साथ; पी -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
ट्वालबर्ग

44

किसी भी पूर्णांक मान के साथ उपसर्ग 0एक अष्टाधारी मूल्य है। Ie: 01 ऑक्टल 1, 010 ऑक्टल 10 है, जो दशमलव 8 है, और 0 ऑक्टल 0 है (जो दशमलव है, और कोई अन्य, 0)।

तो हाँ, '0' एक अष्टकोणीय है।

यह अंग्रेजी के व्याकरण स्निपेट का सादा अंग्रेजी अनुवाद है।


एक पूर्णांक के साथ उपसर्ग 0xहै नहीं लगी होती 00xस्पष्ट रूप से अलग उपसर्ग है। जाहिरा तौर पर ऐसे लोग हैं जो यह अंतर नहीं कर सकते हैं।

उसी मानक के अनुसार, यदि हम जारी रखते हैं:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
"0 'से शुरू होने वाला कोई भी पूर्णांक मूल्य एक अष्टाधारी मूल्य है।" सच नहीं। उदाहरण: 0xA '0' से शुरू होता है और पूर्णांक मान होता है।
निकोलाई रुहे

4
0xएक टोकन नहीं है। पूर्णांक शाब्दिक 0xएक एकल टोकन के साथ शुरू होता है।
कीथ थॉम्पसन

4
उस परिभाषा के लिए आप किस स्रोत का हवाला दे रहे हैं? शब्द "टोकन" को C (N1570 6.4) और C ++ (C ++ 11 2.7 [lex.token]) मानकों द्वारा वाक्यविन्यास रूप से परिभाषित किया गया है। 0xयोग्यता नहीं है। (कम से कम C में, यह एक प्रीप्रोसेसिंग नंबर (N1570 6.4.8) है अगर यह हेक्साडेसिमल कंटिन्यू का हिस्सा नहीं है, लेकिन यह टोकन नहीं है।)
कीथ थॉम्पसन

11
हम पूर्णांक स्थिरांक / शाब्दिक के सिंटैक्स की चर्चा कर रहे हैं जैसा कि सी और सी ++ मानकों द्वारा परिभाषित किया गया है । "टोकन" के मानकों की परिभाषा इस संदर्भ में उपयोग करने के लिए सबसे उपयुक्त कैसे नहीं है? आपका अपमान जनक अनुचित है। और अगर आपको लगता है कि मैं कुछ ऐसा इंगित करने के लिए धमकाने वाला हूं जो मुझे लगता है कि आपके उत्तर में एक तकनीकी त्रुटि है, तो मेरा सुझाव है कि आपको उस शब्द के अर्थ पर पुनर्विचार करना चाहिए। (आपने अपनी परिभाषा के स्रोत के बारे में मेरे सवाल का कभी जवाब नहीं दिया।)
कीथ थॉम्पसन

4
अगर किसी को जिज्ञासा है, तो यह कथन कि " एक टोकन एक या अधिक वर्णों का एक समूह है जो एक समूह के रूप में महत्वपूर्ण है। " इस विकिपीडिया लेख से प्रतीत होता है ।
कीथ थॉम्पसन

-2

जाहिरा तौर पर शून्य से शुरू होने वाले सभी पूर्णांक शाब्दिक वास्तव में अष्टक हैं। इसका मतलब है कि इसमें 0 भी शामिल है। शून्य से शून्य होने से यह बहुत कम होता है। लेकिन इस तथ्य को न जानना आपको नुकसान पहुंचा सकता है।

मुझे यह एहसास हुआ जब मैं द्विआधारी संख्याओं को दशमलव और हेक्सिडेसिमल आउटपुट में बदलने के लिए एक कार्यक्रम लिखने की कोशिश कर रहा था। हर बार जब मैं शून्य से शुरू होने वाला नंबर दे रहा था तो मुझे गलत आउटपुट मिल रहा था (उदाहरण के लिए, 012 = 10, 12 नहीं)।

यह जानकारी जानना अच्छा है, ताकि आप एक ही गलती न करें।


7
पूर्णांक शाब्दिक शून्य से शुरू होता है लेकिन शून्य के बाद 'x' के बिना।
लुसीबुबल

5
बिना प्रमाण के "हां" कहना एक उत्तर नहीं है।
ऑर्बिट

1
इस तर्क से, 09 एक अष्टक संख्या है।
0xc0de

3
@ 0xc0de: नहीं, 09यह एक अष्टक संख्या नहीं है, क्योंकि यह एक संख्या नहीं है; यह किसी भी प्रकार के पूर्णांक शाब्दिक के लिए वाक्यविन्यास से मेल नहीं खाता है।
कीथ थॉम्पसन

7
मुझे पूरा विश्वास है कि @ 0xc0de जानता है कि 09यह एक अष्टक संख्या नहीं है। क्या कहा गया था, " इस तर्क से , 09एक अष्टक संख्या है।" निहितार्थ यह है कि है के बाद से, 09है नहीं , किसी ऑक्टल संख्या को तर्क गलत होना चाहिए।
टीआरजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.