Kommentarer
- Jeg foretrekker å fokusere på de andre 3000 linjene …
-
int*i;
– mellomrom vokser ikke ' på trær, du vet … - Dette er egentlig det samme spørsmålet; her ' er svaret mitt .
- Plassering av stjerne i pekererklæringer , I C, hvorfor er stjernen foran variabelnavnet, i stedet for etter typen?
Svar
Hvis du skriver:
int* i, j, k;
foreslår du villedende at alle i, j og k er pekepinner til int
.
Så jeg hevder at det er overlegen å legge ved * til variabelen navn.
Kommentarer
Svar
Jeg foretrekker int* i
fordi i
har typen «peker til en int», og jeg føler dette gjør det enhetlig med typesystemet. Selvfølgelig kommer den velkjente oppførselen når vi prøver å definere flere pekere på en linje (nemlig stjernen må settes foran hvert variabelnavn for å erklære en peker), men jeg erklærer ganske enkelt ikke pekere på denne måten. Jeg tror også det er en alvorlig mangel på språk i C-stil.
Kommentarer
- Også jeg følger denne konvensjonen. Av samme grunn.
- Personlig, hvis jeg ' erklærer flere pekere i koden min, behandler jeg det som en kodelukt. Jeg skulle ikke ' ikke trenger så mange pekere; og vanligvis gjør jeg ikke ' t. Så spørsmålet om flere erklæringer på en enkelt linje kommer aldri opp i noen kode jeg skriver: En erklæring per linje.
- Problemet med dette er at typen ikke er en " peker til en int ". C (og C ++) har ikke ' t en pekertype. Det er en peker til en minneblokk, som er av typen int.
- Jeg vil hevde at
*i
har en typeint
. - @Billy: I så fall har jeg ' aldri sett den forvirringen i 12 år med å prøve å forstå, analysere og forklare standardiserte . " Pekeren til en int " er en helt gyldig type i C og C ++.
Svar
For C, der vi ikke har sterkt fokus på typer, foretrekker jeg:
int *i;
Fordi den har en emfese på int
, ikke pekeren. Hva er int
? *i
er int.
Kommentarer
- Bra poeng. Med pekere kan du tenk på starten som en del av navnet. Hvis du for eksempel har
int i = 5
, for å få verdieni
, bruker du navneti
. På samme måte, hvis du harint *i; *i = 5
, så bruker du*i
. - Jeg leser int * i som: * i er en int. Derfor er jeg en peker til int.Variable deklarasjoner i C-brukstypeuttrykk, int og * er bare operatorer. int * i tolkes som int (* (i)) og tolkes slik jeg har typen peker-til-heltall. char * p [] analyserer som char (* ([] (p))) (fordi [] har høyere prioritet enn *) og betyr: p har type array-av peker-til char.
- For derfor tror jeg de valgte å skrive * ved siden av variabelen, fordi * er en operatør som brukes på den.
- Jeg ser ut til å foretrekke dette også – holder typen definisjon renere. Pluss at det Giorgio skrev gir mening for meg også, og Dennis skrev noe i tråd med resonnementet.
Svar
Jeg har foretrukket int* i
i årevis. Det er imidlertid et sterkt argument for int *i
fordi når du bruker den tidligere stilen, må du fortsatt huske regelen om flere erklæringer:
int* a, *b; // not int* a, b;
Fordi du må huske denne regelen, får du ikke noe enkelt – men jeg vil heller ikke si at den er mer kompleks. Å unngå flere erklæringer på en linje er bare en annen måte å si at du husker denne regelen Forskjellen mellom de to stilene er stor.
Selv når jeg bruker den, føles det imidlertid litt dumt å late som at C-erklæringens syntaks fungerer annet enn den gjør, ved å plassere stjernen ved siden av typen heller enn variabelen som den er syntaktisk bundet til.
Jeg kjøper ikke inn den ene understreker peketypen (for i
) mens den andre legger vekt på int-typen (for *i
), men det kan være at etter 15 år med C og C ++ bruk, er det bare er når jeg ser på det, uten å måtte tenke på det — someth de fleste nybegynnere som stiller dette spørsmålet, kan ikke gjøre det.
Selv om jeg foretrekker det, synes jeg det ikke er vanskelig å lese / skrive kode i den andre stilen. Konsistens, bla bla bla.
Ingen grunn til å nevne int * i
.
Svar
Jeg foretrekker den første. Det blir naturlig da det å være en peker er en del av typen.
Når jeg bruker C #, håndterer det typene på en mer intuitiv måte enn C, så det er ikke noe problem å erklære flere pekere i samme utsagn:
int* a, b, c; // three pointers
Svar
Jeg foretrekker int* i
(C ++ – stil).
Jeg unngår å erklære flere variabler i ett utsagn på grunn av den resulterende visuelle uklarheten (int* i, j
).
Se også Bjarne Stroustrup «C ++ Style and Technique FAQ for rationales.
Svar
Hvis du vil erklære flere variabler, men ikke vil gjenta stjernen:
template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3;
(Som du kan se inne i strukturen, Jeg foretrekker int* i
stil.)
Og her er en mer generell løsning:
template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3;
Denne fungerer med hvilken som helst «problematisk type», for eksempel matriser og referanser:
Kommentarer
- omg, c ++ viser alltid noe nytt for meg :). Takk!
- OMG, C ++ er forferdelig!
typedef int* int_ptr
ville ha gjort susen. Visst, jeg må erklære en ny typedef for forskjellige pekertyper, men i praksis hvor mange vil det være? Åtte på det meste? - @benzado I praksis trenger du ikke ' t trenger typedef eller noen av de fancy triksene jeg demonstrerte, fordi ingen sunn person erklærer flere variabler i en linje. Fortsatt interessant, skjønt.
- Jeg vet, jeg snakket mer om tendensen til C ++ – programmer til å bruke språkfunksjoner bare fordi de kan.
- @benzado: !!! Jeg har sett dette så ofte!
Svar
Jeg vil gå for int* i;
siden den første delen betegner variabeltypen (peker til int), mens den andre delen betegner navnet (i
). Det ville ikke være fornuftig for meg at typen er int
og navnet er *i
. Også int * i;
ser litt ut som multiplikasjon for meg.
Kommentarer
- Syntaks for C-erklæring er ikke ' t konsistent i denne forbindelse, da typeinformasjon lett kan komme etter identifikatoren: arrays er det klareste eksemplet.
- @Roger: Jeg vet, men dette spørsmålet var spesifikt om en enkelt variabelerklæring, og ingenting annet.
- Jeg tror at ' leser litt mye inn i den. 🙂 Slik jeg forstår spørsmålet, er det ' som spør om hvilken stil du bruker overalt.
- @Roger: Du ' har sannsynligvis rett, men målet mitt var å svare på OP ' spørsmål: " Hva er din favorittmetode for å erklære en peker? ".Det er åpenbart at alle har frihet til å se på en koster som ser på problemet som presenteres i spørsmålet, og det oppmuntres til og med her. Som noen som ikke ' ikke utvikler seg i C / C ++, følte jeg at det ville komme for langt fra mitt fagfelt.
Svar
I erklæringer bruker jeg int * i;
, du leser det som i is a pointer to an integer
.
Pekeren bidrar til både typen og variabelen, så den skal være i midten.
Det er en god ting å unngå å erklære flere ting på samme linje: int * i, j;
Svar
Det er ingen pekertyper i C! Så, «int * «betyr ingenting. Stjernen er alltid bundet til elementet som er skrevet rett til den, den tilhører elementet rett til den.» * i «er en int. Og på grunn av * i er en int, følger det at jeg er en pekeren til int. Det er logikken bak, og det er derfor «int * i» er den eneste mulige løsningen. Alt annet er en illusjon (som i de fleste tilfeller automatisk korrigeres av kompilatoren). I C ++ og C # er det noe annet. Men for C er det bare en bibel: «Dennis M. Ritchie: The C Programming Language». Dennis (RIP!) Skrev den: «int * i». Det er ikke nødvendig å sett spørsmålstegn ved dette.
Kommentarer
- " Det er ingen pekertyper i C " – Hvor fikk du den ideen?
int*
er en pekertype.
Svar
Jeg bruker faktisk alle tre konvensjonene under spesifikke omstendigheter. Ved første øyekast virker jeg inkonsekvent, men …
-
int *
når identifikatoren ikke er tilstede, for å forsterke visuelt at navnet ikke er tilstede. -
int* intptr
påtypedef
s og lignende erklæringer for å forsterke visuelt at det er en del av typen. Tilsvarende med funksjonspekererklæringer:(int* (*foo)(int))
-
int *identifier
ogclass &identifier
på funksjonsparametere for å forsterke visuelt at parameteren potensielt er en såkalt «ut» -parameter. -
const int * const * const
når jeg bruker cv kvalifiserende. -
int * foo;
om lokale erklæringer.
Jeg antar at jeg er noe visuelt orientert.
Svar
Jeg bruker int *i
fordi det er lettere å se at det er en peker, skjønt Jeg tror ikke det er veldig viktig.
int * i;
er ikke-kandidat bare fordi det ser ut som multiplikasjon med et raskt blikk.int*
blir sett på som en type, ogint* i, j
erklærer to pekere. Spørsmålet kan betraktes som ufullstendig – det avhenger av språket du ' bruker hvilke stiler som er rimelige. I CI følgint *x
, i C # gjør jeg noe annet.