Zasadniczo rzecz biorąc, zasada po prostu nie działa, bo inaczej prace redefinicji tego, co rozumie się przez spiralę (w tym przypadku, nie ma sensu się nad tym zastanowić, np.
int* a[10][15];
Reguła spiralna daje a jest tablicą [10] wskaźnika do array [15] int, co jest błędne.Jeżeli twoja strona, to też nie działa, w rzeczywistości w przypadku signal
, to nie jest jasne, gdzie powinieneś zacząć spiralę.
Zasadniczo łatwiej jest znaleźć przykłady, w których reguła zawodzi niż w przykładach, w których działa.
Często mam pokusę, aby powiedzieć, że parsowanie deklaracji C++ jest proste, ale żadna z osób, która próbowała skomplikowanych deklaracji, nie uwierzyłaby mi w to, . Z drugiej strony nie jest tak trudne, jak to się czasem wydaje. Sekretem jest myślenie o deklaracji dokładnie tak samo jak wyrażenie, ale z dużo mniejszą liczbą operatorów i bardzo prostą zasadą pierwszeństwa: wszyscy operatorzy po prawej stronie mają pierwszeństwo przed wszystkimi operatorami po lewej. W przypadku braku nawiasów oznaczenie powoduje przetworzenie wszystkiego najpierw na prawo, a następnie wszystko na lewo i przetwarzanie nawiasów dokładnie tak samo, jak w każdym innym wyrażeniu. rzeczywista trudność polega nie składnia per se, ale że wyników jest kilka bardzo skomplikowane i intuicyjne deklaracje, w szczególności tam, gdzie zaangażowane są zwracane wartości funkcyjne i wskaźniki do funkcje: pierwsza w prawo, to znaczy wtedy lewy reguła że operatorzy na określonym poziomie często powszechnie oddziela np
int (*f(/* lots of parameters */))[10];
końcowe określenie w rozwoju tutaj jest int[10]
, ale wprowadzenie z [10]
po całkowitym opisie funkcyjnego (w najmniej dla mnie) bardzo nienaturalne, i muszę przestać i wypracować to za każdym razem . (Prawdopodobnie ta tendencja do logicznie sąsiadujących części rozprzestrzenia się, co prowadzi do spiralnej reguły.Od problem jest oczywiście, że w przypadku braku nawiasów, nie zawsze są one zawsze rozłożone — za każdym razem, gdy widzisz [i][j]
, zasada jest iść prawo, a następnie przejść jeszcze raz w prawo, zamiast spirali)
A ponieważ jesteśmy teraz myśli o deklaracji w zakresie wyrażeń:. co zrobić, gdy wyrazem staje się zbyt skomplikowane czytać? Wprowadzasz zmienne pośrednie w kolejności , aby ułatwić czytanie. W przypadku deklaracji, "zmienne pośrednie" to typedef
. W szczególności chciałbym, aby twierdził, że za każdym razem, gdy część zwracanego typu kończy się po argumentach funkcji (i wiele innych razy), użytkownik powinien użyć , aby uczynić deklarację prostszą. (Ta jest jednak regułą "rób, co mówię, nie jak ja", boję się, że Od czasu do czasu używam bardzo złożonych deklaracji.)
Proponuję zapytać 'Vorac' kiedy to pójdzie źle; Nie jestem świadomy okoliczności, w których coś pójdzie nie tak. –
@ Jonathan Leffler, więc nie ma żadnych znanych problemów i spiralna zasada nigdy nie jest błędna? – Vorac
OK - to [James Kanze] (http://stackoverflow.com/users/649665/james-kanze) ma [widoki] (http://stackoverflow.com/questions/7526152/easy-rule-to -read-complicated-const-declarationations/7526298 # comment23257858_7526298) na temat artykułu opublikowanego w 1994 roku (nie ty, przepraszam za błędy w interpretacji). Nie wiem, jaki jest sprzeciw Jamesa; Nie wiem o okolicznościach, w których zawodzi (ale nie studiowałem tego zbyt mocno). To nie jest to samo, co powiedzenie, że nie ma takich okoliczności, ale uznałbym ten niewyjaśniony, niepotwierdzony komentarz za tak wiele dymu. –