Komentáře
- Raději bych se zaměřil na ostatních 3000 řádků …
-
int*i;
– mezery ' nerostou na stromech, víte … - Toto je v podstatě stejná otázka; zde ' moje odpověď .
- Umístění hvězdičky v deklaraci ukazatele , Proč je v jazyce C hvězdička před názvem proměnné, nikoli za typem?
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
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á typint
. - @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 hodnotui
pomocí názevi
. Podobně, pokud máteint *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
natypedef
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
aclass &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é.
int * i;
není uchazečem jen proto, že to na první pohled vypadá jako násobení.int*
je považován za typ aint* 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 postupujteint *x
, v C # dělám jinak.