2010-09-14 4 views
17

यह प्रश्न this other question about C declarations का पालन करता है। इस प्रश्न का उत्तर पढ़ते हुए, मैंने spiral rule के बारे में पढ़ा और मुझे यह भी समझा कि "घोषणा का उपयोग करने का क्या अर्थ है"।सी और सी ++ घोषणाओं को पार्स करने के लिए सर्पिल नियम और 'घोषणा का उपयोग करता है'

अभी तक ठीक है। लेकिन तब मैं this declaration पढ़ें:

char *(*(*a[N])())(); 

और मैं सोच रहा था कि कैसे साथ यह पार्स करने के लिए 'नियम' "घोषणा उपयोग इस प्रकार है"। विशेष रूप से सरणी भाग के लिए।

क्या मैंने पढ़ा है:

(*(*a[N])()) 

एक समारोह () लौटने एक char *, तो, अपसंदर्भन निम्नलिखित

(*a[N])() // 1 

इस 'एक char* लौटने समारोह' है है, और इसलिए 1 एक है 'char *' पर लौटने वाले फ़ंक्शन के लिए पॉइंटर तो मैं कहूंगा कि '(*a[N]) कहलाता है, यह [पिछली घोषणा] है। इस बिंदु पर हमारे पास (*a[N]) एक फ़ंक्शन को char * लौटने वाले फ़ंक्शन पर लौटने वाला फ़ंक्शन है।

लेकिन तब मुझे नहीं पता कि इस नियम को 'सूचक से सरणी' और 'सूचक की सरणी' के बीच अंतर करने के लिए कैसे लागू किया जाए।

क्या कोई इसे स्पष्ट कर सकता है?

अन्य प्रश्न: & (सी ++ में), *, और [] के बीच, इस तरह की घोषणाओं में "प्राथमिकता" के नियम क्या हैं? अगर मैं 'सर्पिल नियम' सही ढंग से समझ में आ


जाँच करने के लिए, मैं भी नीचे इस अभिव्यक्ति को पार्स [हो सकता है "पूर्वता" सही शब्द नहीं है]; कृपया मुझे बताएं कि क्या मैं गलत हूं।

 +-----------+ 
     | +------+ | 
     | | +-+ | | 
     | |^| | | 
char* (*(* a[N])())(); 
    ^^^^^^
    | | | | | | 
    | | +---+ | | 
    | +--------+ | 
    +--------------+ 

मेरे लिए यह आसान (पाश से पाश) है:

  • a एन की एक सरणी है ...
  • सूचक लौटने कार्य करने के लिए ...
  • सूचक लौटने कार्य करने के लिए ...
  • char *

लेकिन मुझे शायद कुछ याद आ रहा है जो उस मामले में मुझे सही उत्तर प्राप्त करने देता है लेकिन यह एक और अधिक जटिल मामले में गलत हो सकता है।

+0

@ वैलिटी: यदि आप सी ++ टैग छोड़ने जा रहे हैं, तो आपको सी ++ में भी '&' का उल्लेख छोड़ना होगा। –

+0

@ जोनाथन लेफ्लर अच्छा बिंदु, आम तौर पर मैं कहूंगा कि इसे दो प्रश्नों में विभाजित करने की जरूरत है, लेकिन ऐसा पुराना सवाल मैं ऐसा करने में अनिच्छुक हूं। – Vality

+0

@ वैली सवाल कैसे अचानक सवाल आया? (मुझे 'अच्छा सवाल' बैज के लिए अधिसूचित किया गया था)। –

उत्तर

12

आपको इसे चरणों में बनाना होगा।

char *X(); // X =~ (*(*a[N])()) 

समारोह लौटने char*

char *(*Y())(); // Y =~ (*a[N]) 

समारोह लौटने सूचक char* लौटने कार्य करने के लिए।

एक घोषणा में, बस एक अभिव्यक्ति (घोषणा अनुवर्ती उपयोग) के रूप में, पोस्टफ़िक्स [] एक उच्च पूर्वता कि एकल * तो *a[N]*(a[N]), नहीं (*a)[N] के बराबर है है।

char *(*(*Z)())(); // Z =~ a[N] 

समारोह लौटने सूचक को सूचक char* लौटने कार्य करने के लिए। कार्यों के लिए एन संकेत के

char *(*(*a[N])())(); 

सरणी char* लौटने कार्य करने के लिए एक सूचक लौटने।

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