Jaka jest twoja ulubiona metoda deklarowania wskaźnika?
int* i;
lub
int *i;
lub
int * i;
lub
int*i;
Proszę wyjaśnić dlaczego.
patrz także: http://www.stroustrup.com/bs_faq2.html#whitespace
c
coding-style
pointers
lesmana
źródło
źródło
int*i;
-Odpowiedzi:
Jeśli napiszesz:
mylnie sugerujesz, że wszystkie i, j i k są wskaźnikami do
int
.Twierdzę więc, że lepiej jest dołączyć * do nazwy zmiennej.
źródło
int * i;
że nie konkuruje tylko dlatego, że na pierwszy rzut oka wygląda jak mnożenie.int*
jest postrzegane jako typ iint* i, j
deklaruje dwa wskaźniki. Pytanie można uznać za niekompletne - zależy to od używanego języka, które style są rozsądne. W CI wykonajint *x
, w C # robię inaczej.Wolę,
int* i
ponieważi
ma typ „wskaźnik do int” i czuję, że to czyni go jednolitym z systemem typów. Oczywiście pojawia się dobrze znane zachowanie podczas próby zdefiniowania wielu wskaźników w jednym wierszu (mianowicie gwiazdka musi być umieszczona przed każdą nazwą zmiennej, aby zadeklarować wskaźnik), ale po prostu nie deklaruję wskaźników w ten sposób. Ponadto uważam, że jest to poważna wada w językach w stylu C.źródło
*i
ma pewien rodzajint
.W przypadku C, gdzie nie skupiamy się na typach, wolę:
int *i;
Ponieważ ma w sobie empirię
int
, a nie wskaźnik. Co to jestint
?*i
jest int.źródło
int i = 5
, aby uzyskać wartośći
, użyj nazwyi
. Podobnie, jeśli maszint *i; *i = 5
, to aby uzyskać wartość, użyj*i
.Wolę
int* i
od lat. Istnieje jednak mocny argument za tym,int *i
że podczas korzystania z poprzedniego stylu nadal musisz pamiętać regułę wielokrotnej deklaracji:Ponieważ musisz pamiętać tę zasadę, nie zyskujesz w prosty sposób - ale nie powiedziałbym, że jest bardziej złożona. Unikanie wielu deklaracji w jednym wierszu to kolejny sposób na powiedzenie, że pamiętasz tę regułę. Różnica między tymi dwoma stylami jest sporna.
Nawet gdy go używam, wydaje się to trochę głupie, aby udawać, że składnia deklaracji C działa inaczej niż ona, umieszczając gwiazdkę obok typu, a nie zmiennej, z którą jest on syntaktycznie związany.
Nie kupuję się, że jedna podkreśla typ wskaźnika (na
i
), podczas gdy drugi podkreśla typ int (za*i
), ale może być tak, że po 15 latach C i C ++ użytku, to po prostu jest , gdy patrzę na nią, bez myśleć o tym… - coś, co większość początkujących, którzy zadają to pytanie, nie jest jeszcze w stanie tego zrobić.Ponadto, nawet biorąc pod uwagę moje preferencje, nie jest mi trudno czytać / pisać kod w innym stylu. Spójność, bla bla bla.
Nie trzeba nawet wspominać
int * i
.źródło
Wolę pierwszy. To naturalne, że wskaźnik jest częścią tego typu.
Gdy używam C #, obsługuje typy w bardziej intuicyjny sposób niż C, więc nie ma problemu z zadeklarowaniem kilku wskaźników w tej samej instrukcji:
źródło
Wolę
int* i
(styl C ++).Unikam deklarowania wielu zmiennych w jednej instrukcji ze względu na wynikową niejednoznaczność wizualną (
int* i, j
).Zobacz także często zadawane pytania dotyczące stylu i techniki Cj Bjarne Stroustrup w C ++ .
źródło
Jeśli chcesz zadeklarować wiele zmiennych, ale nie chcesz powtarzać gwiazdki:
(Jak widać w szablonie struktury, wolę
int* i
styl).A oto bardziej ogólne rozwiązanie:
Ten działa z dowolnym „typem problematycznym”, na przykład tablicami i referencjami:
źródło
typedef int* int_ptr
zrobiłby lewę. Jasne, muszę zadeklarować nowy typedef dla różnych typów wskaźników, ale w praktyce ile to będzie? Osiem co najwyżej?Wybrałbym,
int* i;
ponieważ pierwsza część oznacza typ zmiennej (wskaźnik do int), podczas gdy druga część oznacza name (i
). Nie ma dla mnie sensu, że ten typint
i nazwa to*i
. Poza tymint * i;
wygląda mi to na pomnożenie.źródło
W deklaracjach, których używam
int * i;
, czytasz to jakoi is a pointer to an integer
.Wskaźnik przyczynia się zarówno do typu, jak i do zmiennej, więc powinien znajdować się na środku.
Dobrze jest unikać deklarowania wielu rzeczy w tym samym wierszu:
int * i, j;
źródło
Właściwie korzystam ze wszystkich trzech konwencji w określonych okolicznościach. Na pierwszy rzut oka wydaje się niespójny, ale ...
int *
gdy identyfikator nie jest obecny, aby wizualnie potwierdzić, że nazwa nie jest obecna.int* intptr
natypedef
s i podobnych deklaracjach, aby wizualnie wzmocnić, że jest to część tego typu. Podobnie z deklaracjami wskaźnika funkcji:(int* (*foo)(int))
int *identifier
orazclass &identifier
parametry funkcji w celu wizualnego wzmocnienia, że parametr jest potencjalnie tak zwanym parametrem „out”.const int * const * const
ilekroć używam kwalifikatorów cv .int * foo;
w sprawie lokalnych deklaracji.Chyba jestem trochę zorientowany wizualnie.
źródło
W C nie ma typów wskaźników! Zatem „int *” nic nie znaczy. Gwiazdka jest zawsze powiązana z elementem zapisanym po prawej stronie, należy do elementu bezpośrednio do niej. „* i” to int. A ponieważ * i jest int, wynika z tego, że i jest wskaźnikiem int. Taka jest logika i dlatego „int * i” jest jedynym możliwym rozwiązaniem. Cała reszta to złudzenie (które w większości przypadków jest automatycznie korygowane przez kompilator). W C ++ i C # to coś innego. Ale dla C jest tylko jedna biblia: „Dennis M. Ritchie: Język programowania C”. Dennis (RIP!) Napisał: „int * i”. Nie ma potrzeby kwestionować tego.
źródło
int*
jest typem wskaźnika.Używam,
int *i
ponieważ łatwiej jest zauważyć, że jest wskaźnikiem, choć nie sądzę, żeby to naprawdę miało znaczenie.źródło