int * i; tai int * i; tai int * i; [suljettu]

Kommentit

Vastaa

Jos kirjoitat:

int* i, j, k; 

ehdotat harhaanjohtavasti, että kaikki i, j ja k osoittavat int.

Joten väitän, että on parempi liittää * muuttujaan nimi.

Kommentit

  • Ja ehdotan ' ehdotan int * i; ei ole kilpailija vain siksi, että se näyttää kerrannaiselta nopeasti.
  • +1, koska en ottanut ' huomioon tätä skenaariota aiemmin.
  • " ehdotat harhaanjohtavasti, että kaikki i, j ja k ovat viitteitä int. " ellet ' kirjoittamalla C # uudelleen, jossa int* nähdään tyypinä, ja int* i, j julistaa kaksi osoitinta. Kysymyksen voidaan katsoa olevan keskeneräinen – se riippuu kielestä, jota ' käytät, mitkä tyylit ovat kohtuullisia. Seuraa CI: ssä int *x, C #: ssä toisin.
  • @Joren: Valitettavasti, koska en ollut C # -ohjelmoija, oletin yksinkertaisesti katsomalla koodin fragmenttia kysymys oli C tai C ++.
  • Mielestäni on täysin järkevää olettaa, että sen C tai C ++, ellei C # mainita erikseen. C #: ssä ei näy viitteitä kovin usein.

Vastaa

Pidän parempana int* i koska i -tyyppi on ”pointer to int”, ja mielestäni se tekee siitä yhdenmukaisen tyyppijärjestelmän kanssa. Tietysti tunnettua käyttäytymistä esiintyy, kun yritetään määrittää useita osoittimia yhdelle riville (nimittäin tähti on laitettava jokaisen muuttujan nimen eteen osoittamaan osoitin), mutta en yksinkertaisesti ilmoita osoittimia tällä tavalla. Uskon myös, että se on vakava virhe C-tyylisissä kielissä.

Kommentit

  • Minäkin noudatan tätä käytäntöä. Samasta syystä.
  • Jos henkilökohtaisesti ' ilmoitan useita osoittimia koodissani, käsittelen sitä koodihaisuna. Minun ei pitäisi ' tarvita niin monta osoitinta; ja yleensä en ' t. Joten kysymys useista ilmoituksista yhdellä rivillä ei koskaan tule esiin missään kirjoittamassani koodissa: Yksi ilmoitus riviä kohti.
  • Tässä ongelmana on, että tyyppi ei ole " osoitin int ". C: llä (ja C ++) ei ole ' t osoittimen tyyppiä. Se on osoitin muistilohkolle, jonka tyyppi on int.
  • Väitän, että *i -tyyppi on int.
  • @Billy: Jos on, en ' ole koskaan nähnyt sekaannusta 12 vuoden aikana yrittäessäni ymmärtää, jäsentää ja selittää standardeja . " Int " -osoitin on täysin kelvollinen tyyppi C- ja C ++ -lajeissa.

Vastaus

C: lle, jossa emme keskity vahvasti tyyppeihin, mieluummin:

int *i;

Koska sillä on korostus int: ssä, ei osoittimessa. Mikä on int? *i on int.

Kommentit

  • Hyvä asia. Osoittimilla voit ajattele alku olevan osa nimeä. Jos sinulla on esimerkiksi int i = 5, saat arvon i, kun käytät nimi i. Vastaavasti, jos sinulla on int *i; *i = 5, niin saadaksesi arvon, käytä *i.
  • Luin int * i seuraavasti: * i on int. Siksi olen osoitin int: lle.Muuttujien ilmoitukset C-tyypin lausekkeissa, int ja * ovat vain operaattoreita. int * i jäsentyy int (* (i)) ja tulkitaan sillä, että minulla on tyypin osoitin-kokonaisluku. char * p [] jäsentää merkkinä char (* ([] (p))) (koska []: lla on korkeampi etusija kuin *) ja tarkoittaa: p: llä on tyypin taulukko osoitinta Char: lle.
  • Tästä syystä luulen, että he päättivät kirjoittaa * muuttujan viereen, koska * on siihen sovellettu operaattori.
  • Minusta tuntuu mieluummin myös tämä – pitää tyyppimäärityksen puhtaampana. Lisäksi se, mitä Giorgio kirjoitti, on järkevää myös minulle, ja Dennis kirjoitti jotain perusteluissaan.

Vastaa

Olen suosinut int* i vuosia. int *i -sivulla on kuitenkin vahva argumentti, koska edellistä tyyliä käytettäessä sinun on silti muistettava moninkertaisen ilmoituksen sääntö:

int* a, *b; // not int* a, b; 

Koska sinun täytyy muistaa tämä sääntö, et saa mitään yksinkertaisella tavalla – mutta en myöskään sanoisi sen olevan monimutkaisempi. Useiden ilmoitusten välttäminen yhdellä rivillä on vain yksi tapa sanoa, että muistat tämän säännön Kahden tyylin välinen ero on kiistanalainen.

Vaikka käytän sitä, tuntuu kuitenkin hieman typerältä teeskennellä, että C-lausekkeen syntaksit toimivat muulla tavalla kuin tekemällä, sijoittamalla tähti tyypin viereen kuin muuttuja, johon se on syntaktisesti sidottu.

En osta siihen korostaa osoitintyyppiä (kohteelle i), kun taas toinen korostaa int-tyyppiä (*i), mutta voi olla, että 15 vuoden C- ja C ++ -käytön jälkeen se vain on kun katson sitä ilman, että minun tarvitsee ajatella sitä⁠ – joskus Useimmat aloittelijat, jotka kysyvät tätä kysymystä, eivät voi vielä tehdä.

Vaikka edes olisin mielestäni mielestäni mielestäni mielestäni hankala lukea / kirjoittaa koodia toisella tyylillä. Johdonmukaisuus, bla bla blah.

Ei tarvitse edes mainita int * i.

Vastaa

Pidän parempana ensimmäisestä. Se on luonnollista, koska osoitin on osa tyyppiä.

Kun käytän C #: ta, se käsittelee tyyppejä intuitiivisemmin kuin C, joten ei ole ongelmaa ilmoittaa useita osoittimia samassa lauseessa:

int* a, b, c; // three pointers 

vastaus

Pidän parempana int* i (C ++ – tyyli).
Vältän useiden muuttujien ilmoittamista yhdessä lauseessa johtuvan visuaalisen epäselvyyden vuoksi (int* i, j).

Katso myös Bjarne Stroustrupin C ++ -tyylin ja -tekniikan UKK perusteluihin.

Vastaa

Jos haluat ilmoittaa useita muuttujia, mutta älä halua toistaa tähtiä:

template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3; 

(Kuten rakennemallin sisällä näkyy, Pidän parempana int* i -tyyliä.)

Ja tässä on yleisempi ratkaisu:

template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3; 

Tämä toimii minkä tahansa ”ongelmallisen tyypin” kanssa, esimerkiksi taulukot ja viitteet:

Kommentit

  • omg, c ++ näyttää minulle aina jotain uutta :). Kiitos!
  • OMG, C ++ on kauhistuttavaa! typedef int* int_ptr olisi tehnyt tempun. Toki minun on ilmoitettava uusi typef eri osoitintyypeille, mutta kuinka monta sitä käytännössä on? Korkeintaan kahdeksan?
  • @benzado Käytännössä et ' et tarvitse typedefiä tai mitä tahansa hienoja temppuja, jotka olen osoittanut, koska yksikään järkevä ihminen ei ilmoita useita muuttujia yhdellä rivillä. Silti mielenkiintoinen.
  • Tiedän, että puhuin enemmän C ++ -ohjelmien taipumukselle käyttää kieliominaisuuksia vain siksi, että ne pystyvät.
  • @benzado: !!! Olen nähnyt tämän niin usein!

Vastaa

Menen int* i; koska ensimmäinen osa tarkoittaa muuttujan tyyppiä (osoitin int), kun taas toinen osa tarkoittaa nimeä (i). Minulle ei olisi järkevää, että tyyppi on int ja nimi on *i. Myös int * i; näyttää minulle vähän kertolaskulta.

Kommentit

  • C-ilmoituksen syntaksin ei ole ' ei ole tältä osin johdonmukainen, koska tyyppitiedot voivat tulla helposti tunnisteen jälkeen: taulukot ovat selkein esimerkki.
  • @Roger: Tiedän, mutta tämä kysymys oli nimenomaan yhdestä muuttujalausekkeesta, eikä mistään muusta.
  • Luulen, että ' lukee hieman paljon siihen. 🙂 Tapa, jolla ymmärrän kysymyksen, ' kysyy, mitä tyyliä käytät kaikkialla.
  • @Roger: Sinä ' on todennäköisesti oikeassa, mutta tavoitteeni oli vastata OP ' -kysymykseen: " Mikä on suosikkitapasi ilmoittaaksesi osoitin? ".Jokaisella on tietysti mahdollisuus tarkastella kysymyksessä esitettyä asiaa, ja sitä kannustetaan täälläkin. Kun joku, joka ' ei kehity C / C ++: ssa, minusta tuntui, että tekisin niin harhautuessani liian kauas asiantuntemuksestani.

Vastaa

Ilmoituksissa, joita käytän int * i;, luit sen nimellä i is a pointer to an integer.

Osoitin vaikuttaa sekä tyyppiin että muuttujaan, joten sen pitäisi olla keskellä.

On hyvä välttää useiden asioiden ilmoittamista samalla rivillä: int * i, j;

vastaus

C: ssä ei ole osoitintyyppejä! Joten, ”int * ”ei tarkoita mitään. Tähti on aina sidottu siihen kirjoitettuun elementtiin, se kuuluu siihen oikealle.” * i ”on int. Ja koska * i on int, seuraa, että i on osoitin int. Se on sen takana oleva logiikka ja siksi ”int * i” on ainoa mahdollinen ratkaisu. Kaikki muu on harhaa (jonka kääntäjä korjaa useimmissa tapauksissa automaattisesti). C ++: ssa ja C #: ssä se on jotain erilaista. Mutta C: lle on vain yksi raamattu: ”Dennis M. Ritchie: C-ohjelmointikieli”. Dennis (RIP!) Kirjoitti sen: ”int * i”. kyseenalaista tämä.

Kommentit

  • " Kohdassa C " – Mistä sait idean? int* on osoitintyyppi.

vastaus

Käytän kaikkia kolmea käytäntöä tietyissä olosuhteissa. Ensi silmäyksellä tunnen epäjohdonmukaiselta, mutta …

  • int *, kun tunnistetta ei ole, vahvistaa visuaalisesti, että nimeä ei ole.
  • int* intptr typedef – ja vastaavissa ilmoituksissa vahvistamaan visuaalisesti, että se on osa tyyppiä. Vastaavasti funktion osoittimen ilmoitusten kanssa: (int* (*foo)(int))
  • int *identifier ja class &identifier toiminnon parametreista vahvistaaksesi visuaalisesti, että parametri on mahdollisesti ns. ”out” -parametri.
  • const int * const * const aina, kun käytän cv karsinnat.
  • int * foo; paikallisista ilmoituksista.

Olen kai visuaalisesti suuntautunut.

vastaus

Käytän int *i, koska on helpompi nähdä, että se on osoitin, vaikka En usko, että sillä on väliä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *