C का शून्य प्रकार खाली / निचला प्रकार के अनुरूप क्यों नहीं है?


28

विकिपीडिया के साथ-साथ अन्य स्रोत जिन्हें मैंने सी के voidप्रकार को एक इकाई प्रकार के रूप में पाया है एक खाली प्रकार के विपरीत। मुझे यह भ्रामक लगता है क्योंकि यह मुझे लगता है कि voidबेहतर एक खाली / नीचे प्रकार की परिभाषा फिट बैठता है।

  • voidजहाँ तक मैं बता सकता हूँ, कोई मूल्य नहीं रहते ।
  • वापसी प्रकार के साथ एक फ़ंक्शन निर्दिष्ट करता है कि फ़ंक्शन कुछ भी वापस नहीं करता है और इस प्रकार केवल कुछ साइड-इफ़ेक्ट कर सकता है।
  • एक प्रकार void*का सूचक अन्य सभी सूचक प्रकारों का एक उपप्रकार है। साथ ही, void*C में और से होने वाले रूपांतरण निहित हैं।

मुझे यकीन नहीं है कि अगर अंतिम बिंदु के पास voidरिक्त प्रकार होने के तर्क के रूप में कोई योग्यता है , जैसा void*कि कम या ज्यादा विशेष मामला है, जिसके संबंध बहुत अधिक नहीं हैं void

दूसरी ओर, voidअपने आप में अन्य सभी प्रकारों का एक उपप्रकार नहीं है, जो कि जहाँ तक मैं बता सकता हूँ एक प्रकार के लिए एक निचला प्रकार होना आवश्यक है।


10
द्वारा "कुछ भी नहीं लौटाता है" आप वास्तव में मतलब है "ब्याज की कुछ भी नहीं लौटाता है", जबकि आउटपुट खाली के साथ एक फ़ंक्शन बिल्कुल भी नहीं लौटता है (यानी क्रैश या अनन्त रूप से छोरों)।
तूरियन

2
वापसी प्रकार के रूप में, शून्य एक इकाई प्रकार है।
user253751

जवाबों:


38

सी में, voidकई असंबंधित चीजों के लिए उपयोग किया जाता है। यह किसके लिए उपयोग किया जाता है, इसके आधार पर, इसका अर्थ एक इकाई प्रकार, एक खाली प्रकार, या कुछ और हो सकता है।

जब voidस्वयं द्वारा उपयोग किया जाता है (जैसा कि विरोध करने के लिए void*, शून्य करने के लिए एक सूचक), यह एक इकाई प्रकार है, अर्थात एकल मान वाला एक प्रकार। वापसी करने वाले फ़ंक्शंस voidको "कुछ भी नहीं लौटाना" कहा जाता है, लेकिन इसका वास्तव में मतलब यह है कि वे किसी भी जानकारी को वापस नहीं करते हैं। वे जानकारी के बिट्स लौटाते हैं, जिसका अर्थ है कि वे एक प्रकार का मान लौटाते हैं जिसमें 2 0 = 1 अलग-अलग मान होते हैं, अर्थात एक इकाई प्रकार।020=1

यह एक खाली प्रकार नहीं है: एक फ़ंक्शन जो खाली प्रकार लौटाता है, वह मान वापस नहीं कर सकता है, क्योंकि उस प्रकार का कोई मूल्य नहीं है। एक फ़ंक्शन जिसका रिटर्न प्रकार खाली है, केवल हमेशा के लिए लूप कर सकता है, या प्रोग्राम को रद्द कर सकता है, या एक अपवाद बढ़ा सकता है ( longjmp) (या अन्यथा वापस लौटने की व्यवस्था नहीं करता है, उदाहरण के लिए नियंत्रण को दूसरे थ्रेड में स्थानांतरित करके या मानक सी से परे कार्यक्षमता का उपयोग करके प्रक्रिया)। चीजों को भ्रामक रखने के लिए, C voidमें एक खाली प्रकार के बदले में उपयोग करना पारंपरिक है (C में खाली प्रकार नहीं है)।

voidप्रकार की आवश्यकता है भंडारण के टुकड़े। चूँकि C, भंडारण के बाइट्स की पूरी, गैर-संख्या पर कब्जा करने वाली प्रत्येक वस्तु पर जोर देता है, इसलिए इसे प्रकार की एक वस्तु बनाने के लिए मना किया जाता है , और मूल्य को वापस करने के लिए एक विशेष वाक्यविन्यास होता है (मान के साथ एक कथन छोड़ा गया)। ऐसा कोई सिंटैक्स नहीं है जो प्रकार का मान देता है , लेकिन जब भी कोई फ़ंक्शन जिसका रिटर्न प्रकार रिटर्न होता है, तो वह मान होता है ।0voidvoidreturnvoidvoid

C में किसी भी प्रकार की अनुमति देने के अर्थ में निचला प्रकार नहीं है। यहां तक ​​कि अपूर्ण प्रकार इसके मूल्यों की सामान्य प्रकृति को निर्दिष्ट करते हैं, जैसे संकेत या संरचना या यूनियन या फ़ंक्शन। लेकिन void*किसी भी गैर-फ़ंक्शन प्रकार के लिए एक संकेतक है: यह ऑब्जेक्ट पॉइंटर प्रकारों के बीजगणित का सबसे कम तत्व है, अर्थात यह नीचे का ऑब्जेक्ट पॉइंटर प्रकार है। के सामान्य मामले के विपरीत T*, जहां Tकुछ गैर शून्य प्रकार है, void*प्रकार का एक मूल्य के लिए संकेत के प्रकार नहीं है void, लेकिन अनिर्दिष्ट प्रकार के एक मूल्य के लिए संकेत के प्रकार के।


कोई C ++ और C89 में शून्य लौटा सकता है। stackoverflow.com/questions/35987493/…
बार्टकॉकहोम

2
चौथा पैराग्राफ औपचारिक रूप से गलत है। सी में, भंडारण की मात्रा voidअपरिभाषित है, शून्य नहीं। यही कारण है कि प्रकार की वस्तुओं voidको अस्वीकृत नहीं किया जाता है। औपचारिक कारण यह है कि voidएक अधूरा प्रकार है , और वस्तुओं में एक अधूरा प्रकार नहीं हो सकता है।
एमएसलेटर

4
@MSalters नहीं, मैंने जो लिखा है वह औपचारिक रूप से सही है। "क्योंकि" मैं भाषा के डिजाइन के लिए प्रेरणा को संदर्भित करता हूं, भाषा विनिर्देश के अंदर तार्किक संदर्भों को नहीं। voidप्रकार की आवश्यकता है भंडारण के 0 बिट्स। यही कारण है कि सी के डिजाइनरों ने voidएक अपूर्ण प्रकार बनाने का फैसला किया , क्योंकि इसे 0 बाइट्स स्टोरेज (जिसे भाषा डिजाइन पर बहुत अधिक प्रभाव पड़ेगा) या स्टोरेज के 1 बाइट (जो अंतरिक्ष को बर्बाद कर देगा) को परिभाषित करने का विरोध करता है। ।
गिल्स एसओ- बुराई को रोकें '

1
@ गिल्स: क्षमा करें, लेकिन इसका कोई मतलब नहीं है। यदि अनुमति दी जाती है, तो प्रयुक्त स्थान शून्य प्रकार की प्रति वस्तु 1 बाइट होगा , और आपको स्पष्ट रूप से कई voidप्रकार की वस्तुओं की आवश्यकता नहीं होगी । यह उल्लेख करने के लिए नहीं कि ये वस्तुएं अन्य सभी वस्तुओं को अलग कर सकती हैं, इसलिए वास्तविक उपयोग वैसे भी शून्य होगा।
MSalters

4
@CodesInChaos: ठीक है, C ++ वास्तव में खाली संरचना की अनुमति देता है, अर्थात struct E { };। जब एक बेस क्लास के रूप में उपयोग किया जाता है, तो यह शून्य-आकार हो सकता है। (वास्तव में सी / सी ++ जैसी कोई चीज नहीं है, दो भाषाएं अपनी पसंद बनाती हैं और वे इन क्षेत्रों में भिन्न हो सकते हैं। जाहिर तौर पर सी में खाली आधार कक्षाएं नहीं हैं, क्योंकि इसमें पहले स्थान पर ओओ नहीं है)
MSalters

11

नाम "खाली प्रकार" शायद भ्रामक है। इसका मतलब क्या है, जैसा कि आप खुद कहते हैं, प्रकार में कोई मूल्य नहीं है । "खाली" प्रकार के किसी भी व्यक्तिगत मूल्यों को संदर्भित नहीं करता है, यह एक पूरे के रूप में प्रकार को संदर्भित करता है, जिसे संभावित मूल्यों के ~ सेट के रूप में माना जाता है। तो यह कुछ ऐसा नहीं कहता है जैसे "एक फ़ंक्शन रिटर्निंग voidनो इंफॉर्मेशन", लेकिन " प्रकार का कोई अस्तित्व नहीं है "।

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

इसका मतलब यह भी है, यह चर्चा करना भी संभव नहीं है कि खाली प्रकार का मूल्य कितना जानकारी होगा, क्योंकि ऐसा कोई मूल्य नहीं है। (या यदि आप करेंगे, तो "शून्य प्रकार के किसी भी मूल्य में 35093658 बिट्स की जानकारी शामिल है" जैसे एक निरर्थक कथन खाली है।) यह जानकारी का एक अनंत राशि वाले मूल्यों के रूप में सोचने के लिए कुछ हद तक उपयोगी है (हालांकि वास्तव में सही नहीं है) ।

जबकि "वापसी प्रकार" के साथ एक सी फ़ंक्शन voidस्पष्ट रूप से वापस आ सकता है , लेकिन आपको इसके वापसी मूल्य में कोई जानकारी नहीं देता है। ठीक है, यह ठीक है कि एक इकाई प्रकार की विशेषता क्या है: इसके मूल्यों में कोई जानकारी नहीं है, क्योंकि केवल एक ही ऐसा मूल्य है (इसलिए आप हमेशा कह सकते हैं कि वापसी मूल्य क्या होगा, यहां तक ​​कि फ़ंक्शन को कभी भी परेशान किए बिना)।

कोनोर मैकब्राइड (सी से अनुवादित) को उद्धृत करने के लिए:

voidका अर्थ है "बोरिंग"। इसका मतलब है बोरिंग प्रकार जिसमें एक चीज होती है, वह भी उबाऊ। उबाऊ प्रकार के एक तत्व की दूसरे के साथ तुलना करके प्राप्त करने के लिए कुछ भी दिलचस्प नहीं है, क्योंकि उबाऊ प्रकार के एक तत्व के बारे में जानने के लिए कुछ भी नहीं है, इसे अपना ध्यान दें।

यह खाली प्रकार से बहुत अलग है [...]। खाली प्रकार बहुत ही रोमांचक है, क्योंकि अगर कोई आपको कभी इससे संबंधित मूल्य देता है, तो आप जानते हैं कि आप पहले से ही मृत हैं और स्वर्ग में हैं और जो कुछ भी आप चाहते हैं वह आपका है।


दिलचस्प; यदि the की परिभाषा वह फ़ंक्शन है जिसका रिटर्न प्रकार ⊥ कभी समाप्त नहीं हो सकता है, तो C का ऐसा प्रकार है। हम इसे वाष्पशील शून्य कहते हैं।
जोशुआ

दिलचस्प है, मुझे नहीं पता था कि। मैं वास्तव में मानक-अनुरूप नहीं लगता , हालांकि।
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.