int * i; nebo int * i; nebo int * i; [uzavřeno]

Komentáře

Odpověď

Pokud píšete:

int* i, j, k; 

zavádějícím způsobem naznačujete, že všechna i, j a k jsou ukazatele na int.

Takže tvrdím, že je lepší připojit * k proměnné name.

Komentáře

  • A já ' navrhuji int * i; není uchazečem jen proto, že to na první pohled vypadá jako násobení.
  • +1, protože jsem dříve tento scénář nezvažoval. iv. ' / li>
  • " zavádějícím způsobem naznačujete, že všechna i, j a k jsou ukazatele na int. " Pokud vy ' přepisujeme C #, kde int* je považován za typ a int* i, j deklaruje dva ukazatele. Otázku lze považovat za neúplnou – záleží na jazyce, který ' používáte, které styly jsou přiměřené. V CI postupujte int *x, v C # dělám jinak.
  • @Joren: Lituji, ale nejsem programátor v C #, jednoduše jsem předpokládal, že se podívám na fragment kódu v otázka byla C nebo C ++.
  • Myslím, že je naprosto rozumné předpokládat, že jeho C nebo C ++, pokud není výslovně uvedeno C #. Jeden nevidí ukazatele v C # velmi často.

Odpověď

Dávám přednost int* i protože i má typ „pointer na int“ a mám pocit, že je to díky systému typů jednotné. Samozřejmě přichází dobře známé chování, když se pokoušíme definovat více ukazatelů na jednom řádku (jmenovitě je třeba před každý název proměnné uvést hvězdičku, aby se deklaroval ukazatel), ale jednoduše tímto způsobem nedeklaruji ukazatele. Také si myslím, že je to vážná chyba v jazycích ve stylu C.

Komentáře

  • I já se řídím touto konvencí. Ze stejného důvodu.
  • Osobně, když ' deklaruji ve svém kódu více ukazatelů, považuji to za vůni kódu. Neměl bych ' tolik ukazatelů potřebovat; a obvykle nedělám ' t. Takže otázka vícenásobných deklarací na jednom řádku se nikdy neobjeví v žádném kódu, který napíšu: Jedna deklarace na řádek.
  • Problém s tím je, že typ není " ukazatel na int ". C (a C ++) nemá ' typ ukazatele. Je to ukazatel na blok paměti, což je typ int.
  • Tvrdil bych, že *i má typ int.
  • @Billy: Pokud ano, ' jsem ten zmatek za 12 let snahy porozumět, analyzovat a vysvětlit standardy nikdy neviděl . " Ukazatel na int " je v C a C ++ naprosto platný typ.

Odpověď

Pro C, kde nemáme silné zaměření na typy, dávám přednost:

int *i;

Protože má důraz na int, ne na ukazatel. Co je int? *i je int.

Komentáře

  • Dobrá poznámka. S ukazateli můžete Začátek považujte za součást názvu. Pokud například máte int i = 5, získáte hodnotu i pomocí název i. Podobně, pokud máte int *i; *i = 5, k získání hodnoty použijete *i.
  • Četl jsem int * i jako: * i je int. Proto i je ukazatel na int.Deklarace proměnných v C používají výrazy typu, int a * jsou jen operátory. int * i analyzuje jako int (* (i)) a je interpretováno jako i má typ pointer-to integer. char * p [] analyzuje jako char (* ([] (p))) (protože [] má vyšší prioritu než *) a znamená: p má typ pole-ukazatele-na char.
  • pro z tohoto důvodu si myslím, že se rozhodli psát * vedle proměnné, protože * je operátor, který se na ni vztahuje.
  • Zdá se mi, že to také preferuji – udržuje definici typu čistší. Navíc to, co napsal Giorgio, má smysl i pro mě a Dennis ve svém uvažování napsal něco podobného.

Odpověď

Už roky preferuji int* i. Pro int *i však existuje silný argument, protože při použití dřívějšího stylu si musíte pamatovat pravidlo vícenásobné deklarace:

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

Protože si toto pravidlo musíte pamatovat, žádné jednoduše nezískáte – ale ani bych neřekl, že je to složitější. Vyhýbání se více deklaracím na jednom řádku je jen další způsob, jak říci, že si toto pravidlo pamatujete . Rozdíl mezi těmito dvěma styly je diskutabilní.

I když to používám, připadá mi trochu hloupé předstírat, že syntaxe deklarace C funguje jinak než tak, že místo typu umístíte hvězdičku vedle typu než proměnná, na kterou je syntakticky vázána.

Nekupuji do toho zdůrazňuje typ ukazatele (pro i) zatímco druhý zdůrazňuje typ int (pro *i), ale může se stát, že po 15 letech používání C a C ++ stačí je když se na to podívám, aniž bych o tom musel přemýšlet⁠ — ometsometh Většina začátečníků, kteří se ptají na tuto otázku, to zatím „neumí“.

I vzhledem k mým preferencím mi nepřipadá trapné číst / psát kód v jiném stylu. Konzistence, bla bla bla.

Není třeba ani zmiňovat int * i.

Odpovědět

Dávám přednost prvnímu. Přichází přirozeně, protože ukazatel je součástí typu.

Protože používám C #, zpracovává typy intuitivnějším způsobem než C, takže není problém deklarovat několik ukazatelů ve stejném prohlášení:

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

Odpověď

Dávám přednost int* i (C ++ – style).
Vyhýbám se deklaraci více proměnných v jednom příkazu kvůli výsledné vizuální nejednoznačnosti (int* i, j).

Viz také Časté dotazy k C ++ stylu a technice C ++ od Bjarne Stroustrupa pro racionální použití.

Odpověď

Pokud chcete deklarovat více proměnných, ale nechcete opakovat hvězdičku:

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

(Jak vidíte uvnitř šablony struktury, Dávám přednost stylu int* i.

A tady je obecnější řešení:

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

Tento funguje s jakýmkoli „problematickým typem“, například s poli a odkazy:

Komentáře

  • omg, c ++ mi vždy ukazuje něco nového :). Díky!
  • OMG, C ++ je děsivé! typedef int* int_ptr by to zvládl. Jistě, musím deklarovat nový typedef pro různé typy ukazatelů, ale v praxi to bude kolik? Maximálně osm?
  • @benzado V praxi nepotřebujete ' typedef ani žádný z vymyšlených triků, které jsem předvedl, protože žádný rozumný člověk nedeklaruje více proměnných v jednom řádku. Přesto zajímavé.
  • Vím, mluvil jsem spíše o tendenci programů C ++ používat jazykové funkce jen proto, že mohou.
  • @benzado: !!! Viděl jsem to tak často!

Odpověď

Chtěl bych jít int* i; protože první část označuje typ proměnné (ukazatel na int), zatímco druhá část označuje název (i). Nedalo by mi smysl, aby typ je int a název je *i. int * i; mi také připadá jako násobení.

Komentáře

  • Syntaxe deklarace C není ' t v tomto ohledu konzistentní, protože informace o typu mohou snadno přijít po identifikátoru: nejjasnějším příkladem jsou pole.
  • @Roger: Já vím, ale tato otázka byla konkrétně o deklaraci jedné proměnné a o ničem jiném.
  • Myslím, že ' to do toho hodně čte. 🙂 Otázce rozumím tak, že se ' ptá, jaký styl používáte všude.
  • @Roger: Vy ' Pravděpodobně máte pravdu, ale mým cílem bylo odpovědět na otázku OP ' s: " Jaká je vaše oblíbená metoda deklarace ukazatel? ".Je zřejmé, že se každý může volně podívat na problém představený v otázce, a to je zde dokonce podporováno. Jako někdo, kdo se ' t nevyvíjí v C / C ++, jsem cítil, že by se to příliš vzdálilo mé oblasti odbornosti.

Odpověď

V deklaracích používám int * i;, čtete jej jako i is a pointer to an integer.

Ukazatel přispívá k typu i proměnné, takže by měl být uprostřed.

Je dobré vyhnout se deklaraci více věcí na stejném řádku: int * i, j;

Odpověď

V C nejsou žádné typy ukazatelů! Takže, „int * „nic neznamená. Hvězdička je vždy svázána s prvkem, na který je napsáno správně, patří k pravému prvku.“ * i „je int. A protože * i je int, vyplývá z toho, že i je a ukazatel na int. To je za tím logika, a proto je „int * i“ jediným možným řešením. Všechno ostatní je iluze (která je ve většině případů automaticky korigována kompilátorem). V C ++ a C # je to něco jiného. Ale pro C existuje pouze jedna bible: „Dennis M. Ritchie: Programovací jazyk C“. Dennis (RIP!) To napsal: „int * i“. Není třeba zpochybňujte to.

Komentáře

  • " V C " – Odkud jste ten nápad vzali? int* je typ ukazatele.

Odpověď

Ve skutečnosti používám všechny tři konvence za konkrétních okolností. Na první pohled se mi zdá nekonzistentní, ale …

  • int * když identifikátor není k dispozici, aby se vizuálně potvrdilo, že název není k dispozici.
  • int* intptr na typedef s a podobných deklaracích vizuálně zdůraznit, že je součástí typu. Podobně s deklaracemi ukazatelů funkcí: (int* (*foo)(int))
  • int *identifier a class &identifier na funkčních parametrech vizuálně zdůraznit, že parametr je potenciálně takzvaný parametr „out“.
  • const int * const * const kdykoli použiji cv kvalifikátory.
  • int * foo; o místních prohlášeních.

Myslím, že jsem trochu vizuálně orientovaný.

Odpověď

Používám int *i, protože je snazší vidět, že jde o ukazatel Nemyslím si, že je to opravdu důležité.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *