2010-09-14 14 views
17

Bu soru aşağıdakileri this other question about C declarations izlemektedir. Bu soruya verilen cevabı okuyarak, spiral rule'u okudum ve ayrıca “beyanın kullanımdan sonra” ne anlama geldiğini anladım. Şimdiye kadar tamam. Ama sonra this declaration okuyun:Spiral kural ve 'declaration, C ve C++ bildirimlerini ayrıştırmak için kullanımı izler'

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

ve ben bunu ayrıştırmak nasıl merak kuralını ' "beyanı kullanımını izler" oldu. Özellikle dizi bölümü için.

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

bir char *, alttaki

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

dereferencing bu 'bir char* dönen fonksiyonu' dur döndüren bir işlev () olduğunu ve bu yüzden 1 is a:

Ne Okudum olduğunu 'char *' 'i döndüren bir işlevin göstericisine' (*a[N]) çağrıldığında, bu [önceki bildirim] 'olur. Bu noktada, (*a[N]), char * döndüren bir işleve bir işaretçi döndüren bir işlevdir.

Ancak bu kuralı 'işaretçi dizisi' ve 'işaretçi dizisi' arasında ayrım yapmak için nasıl uygulayacağımı bilmiyorum.

Birisi bunu açıklayabilir mi?

Diğer soru: & (C++), * ve [] arasındaki bildirimlerde "öncelik" kuralları nelerdir? Doğru 'sarmal kural' anlamış


, kontrol etmek için, aynı zamanda, aşağıda bu ifadeyi ayrıştırma [belki "öncelik" doğru bir terim değildir]; lütfen yanılıyorsam söyle. Benim için

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

daha kolay (döngü tarafından döngü) aşağıdaki gibidir: ...

  • a N dizisi olan dönen işlev
  • işaretçi ... geri çalışması için
  • işaretçi ...
  • char *

Ama belki de bu durumda doğru cevabı elde etmeme izin veren bir şeyi özlüyorum ama bu daha karmaşık bir durumda yanlış olabilir.

+0

@Vality: C++ etiketini düşürecekseniz, C++ 'da '&' ifadesini de bırakmanız gerekir. –

+0

@JonathanLeffler İyi bir nokta, Normalde bunun iki soruya bölünmesi gerektiğini söyleyebilirim, ancak böyle eski bir soruya bunu yapmakta isteksizim. – Vality

+0

@Vality Neden soru aniden çok fazla dikkat çekti? ('Güzel soru' rozeti için bilgilendirildim). –

cevap

12

Sadece adımlar halinde oluşturmalısınız.

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

işlev geri char*

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

işlev geri işaretçi char* geri çalışması için.Sadece bir ifade (beyan takip kullanımı) 'deki gibi bir bildiride

, sonek [] * çok *a[N] *(a[N]) değil, (*a)[N] eşdeğerdir tekli yüksek bir önceliğe sahiptir. fonksiyon geri işaretçi

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

İşaretçi char* geri çalışması için. char* dönen için bir işlev geri fonksiyonlarına K işaretçiler

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

dizisi.