Який ваш улюблений метод оголошення вказівника?
int* i;
або
int *i;
або
int * i;
або
int*i;
Поясніть, будь ласка, чому.
див. також: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- білі місця не ростуть на деревах, знаєте ...
Який ваш улюблений метод оголошення вказівника?
int* i;
або
int *i;
або
int * i;
або
int*i;
Поясніть, будь ласка, чому.
див. також: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- білі місця не ростуть на деревах, знаєте ...
Відповіді:
Якщо ви пишете:
int* i, j, k;
ви вводять в оману, що всі i, j і k - покажчики на int.
Тож я стверджую, що це перевершує додавання * до імені змінної.
int * i;, що не є претендентом лише на те, що це схоже на множення з першого погляду.
int*розглядається як тип і int* i, jне оголошує два покажчики. Питання можна вважати неповним - це залежить від мови, якою ви користуєтесь, які стилі розумні. У CI слідую int *x, у C # я роблю інакше.
Я вважаю за краще, int* iоскільки iмає тип "вказівник на int", і я вважаю, що це робить його рівномірним із системою типів. Звичайно, відома поведінка виникає, коли намагаються визначити кілька покажчиків на одному рядку (а саме зірочку потрібно ставити перед кожним іменем змінної, щоб оголосити вказівник), але я просто не оголошую вказівники таким чином. Крім того, я думаю, що це серйозний дефект у мовах стилю С.
*iмає тип int.
Для C, де у нас немає сильної уваги до типів, я віддаю перевагу:
int *i;
Тому що він має імпресію на int, а не на вказівник. Що таке int? *iє int.
int i = 5, щоб отримати значення i, ви використовуєте ім'я i. Так само, якщо у вас є int *i; *i = 5, то для отримання значення ви використовуєте *i.
Я віддаю перевагу int* iроками. Однак є вагомий аргумент, int *iтому що, використовуючи колишній стиль, ви все одно повинні пам’ятати правило множинного декларування:
int* a, *b; // not int* a, b;
Оскільки ви повинні пам’ятати це правило, ви не отримуєте жодної спрощеності, але я б і не сказав, що це складніше. Уникнення кількох оголошень на одному рядку - це ще один спосіб сказати, що ви пам’ятаєте це правило. Різниця між двома стилями - суперечка.
Навіть коли я його використовую, однак, мені здається трохи нерозумним робити вигляд, що синтаксис декларації C працює інакше, ніж це, розміщуючи зірочку поруч із типом, а не змінною, до якої він синтаксично пов'язаний.
Я не купую в тому , що один підкреслює тип покажчика (для i) , а інший підкреслює тип INT (для *i), але це може бути , що після 15 років використання З і С ++, це просто є , коли я дивлюся на нього, без треба подумати над цим - щось, що більшість початківців, які задають це питання, ще не можуть зробити.
Крім того, навіть враховуючи мою перевагу, мені не здається читати / писати код в іншому стилі. Послідовність, бла-бла-бла.
Не потрібно навіть згадувати int * i.
Я віддаю перевагу int* i(C ++ - стиль).
Я уникаю оголошення декількох змінних в одному операторі через візуальну неоднозначність ( int* i, j).
Дивіться також поширені запитання щодо стилю та техніки Bjarne Stroustrup щодо стилів та техніки Bjarne Stroustrup .
Якщо ви хочете оголосити кілька змінних, але не хочете повторити зірочку:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(Як ви бачите всередині шаблону struct, я віддаю перевагу int* iстилю.)
І ось більш загальне рішення:
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
Цей працює з будь-яким "проблемним типом", наприклад масивами та посиланнями:
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptrзробив би трюк. Звичайно, я повинен оголосити новий typedef для різних типів вказівника, але на практиці скільки це буде? Найбільше вісім?
Я б продовжував, int* i;оскільки перша частина позначає тип змінної (вказівник на int), а друга частина позначає ім'я ( i). Мені не було б сенсу, що тип є intі ім'я *i. Крім того, int * i;трохи схоже на множення.
У деклараціях, які я використовую int * i;, ви читаєте це як i is a pointer to an integer.
Вказівник сприяє як типу, так і змінній, тому він повинен бути посередині.
Добре уникати декларування кількох речей в одному рядку: int * i, j;
Я фактично використовую всі три конвенції в конкретних обставинах. На перший погляд я здаюся непослідовним, але ...
int * коли ідентифікатора немає, візуально підкреслити, що імені немає.int* intptrна typedefs та подібних деклараціях, щоб візуально підкреслити, що це частина типу. Аналогічно з оголошеннями вказівника функції:(int* (*foo)(int))int *identifierа class &identifierна функціональних параметрах візуально підсилити, що параметр потенційно є так званим параметром «поза».const int * const * constвсякий раз , коли я використовую резюме класифікаторів.int * foo; про місцеві декларації.Я думаю, я дещо зорієнтований візуально.
У C немає типів вказівників! Отже, "int *" нічого не означає. Зірочка завжди пов'язана з елементом, написаним правом на неї, вона належить до правого елемента. "* i" - це int. А оскільки * i - це int, то випливає, що i - вказівник на int. У цьому полягає логіка, і саме тому "int * i" є єдиним можливим рішенням. Все інше - це ілюзія (яка у більшості випадків автоматично виправляється компілятором). У C ++ і C # це щось інше. Але для C існує лише одна біблія: "Денніс М. Річі: Мова програмування на С". Денніс (RIP!) Написав це: "int * i". Не потрібно в цьому сумніватися.
int*- тип вказівника.