it-swarm-eu.dev

int * i; nebo int * i; nebo int * i;

Jaký je váš oblíbený způsob deklarace ukazatele?

int* i;

nebo

int *i;

nebo

int * i;

nebo

int*i;

Prosím vysvětlete proč.

viz také: http://www.stroustrup.com/bs_faq2.html#whitespace

30
lesmana

Pokud píšete:

int* i, j, k;

klamně naznačujete, že i, j a k jsou ukazatele na int.

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

76
Randall Schulz

Preferuji int* i protože i má typ "ukazatel na int", a cítím, že je to jednotné s typovým systémem. Známé chování samozřejmě přichází, když se pokoušíte definovat více ukazatelů na jednom řádku (jmenovitě je třeba před každou proměnnou jméno vložit hvězdičku, aby se prohlásil ukazatel), ale jednoduše tímto způsobem nevykazuji ukazatele. Také si myslím, že je to vážná vada jazyků ve stylu C.

62
Tamás Szelei

Pro C, kde se silně nezaměřujeme 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.

23
alternative

Dávám přednost int* i roky. Existuje však silný argument pro int *i protože při použití předchozího stylu si stále musíte pamatovat pravidlo vícenásobného prohlášení:

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

Protože si musíte pamatovat na toto pravidlo, nezískáváte žádné zjednodušeně - ale také bych neřekl, že je to složitější. Vyhnout se vícenásobným deklaracím na jednom řádku je jen další způsob, jak říci, že si pamatujete toto pravidlo. Rozdíl mezi těmito dvěma styly je moot.

I když je používám, je ale trochu hloupé předstírat, že syntaxe deklarace syntaxe C je jiná než před tím, že místo hvězdičky umístíte hvězdičku vedle proměnné, ke které 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 to být tak, že po 15 letech používání C a C++ je to prostě , když se na to podívám, aniž bych musel přemýšlet o tom it⁠ - Něco, co většina začátečníků, které se ptají na tuto otázku, ještě nemůže udělat.

Také, i když mám přednost, se mi nelíbí číst/zapisovat kód jiným stylem. Konzistence, bla bla bla.

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

7
Roger Pate

Dávám přednost první. Je to přirozené, protože ukazatel je součástí tohoto 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 příkazu:

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

Preferuji int* i (C++ - styl).
Vyhýbám se deklarování více proměnných v jednom příkazu kvůli výsledné vizuální dvojznačnosti (int* i, j).

Viz také Bjarne Stroustrup's C++ Style and Technique FAQ pro zdůvodnění.

5
Archimedix

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 struct, dávám přednost int* i styl.)

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

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

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

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
4
fredoverflow

Šel bych na int* i; protože první část označuje typ proměnné (ukazatel na int), zatímco druhá část označuje jméno (i). To by mi nedávalo smysl, že typ je int a jméno je *i. Taky, int * i; mi připadá trochu jako násobení.

2
Allon Guralnek

V prohlášeních používám int * i;, čtete to 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 deklarování více věcí na stejném řádku: int * i, j;

2
Tamara Wijsman

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

  • int * když identifikátor není přítomen, vizuálně posílit, že název není přítomen.
  • int* intptr on typedefs a podobná prohlášení pro vizuální posílení, že je součástí tohoto typu. Podobně s deklaracemi ukazatelů funkcí: (int* (*foo)(int))
  • int *identifier a class &identifier o funkčních parametrech vizuálně posílit, že parametr je potenciálně tzv. „out“ parametr.
  • const int * const * const kdykoli použiji kvalifikace c-v.
  • int * foo; o místních prohlášeních.

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

1
greyfade

V C nejsou žádné typy ukazatelů! Takže „int *“ neznamená nic. Hvězdička je vždy vázána na psané právo na něj, patří k prvku na něj přímo. "* i" je int. A protože * i je int, znamená to, že i je ukazatel na int. To je logika za tím, a proto je "int * i" jediným možným řešením. Všechno ostatní je iluze (která je kompilátorem ve většině případů automaticky opravena). V C++ a C # je to něco jiného. Ale pro C existuje pouze jedna bible: „Dennis M. Ritchie: Programovací jazyk C“. Dennis (R.I.P.!) To napsal: "int * i". Není třeba o tom pochybovat.

1
Lexi Pim