"Long long" = "long long int" = "long int long" = "int long long"?


153

Я знайшов і те, long int longі int long longможу компілювати для змінного типу. Чи є різниця між long int long, int long long, long longі long long int?

Загалом, чи тип однаковий, якщо він має однакову кількість long?

1 довгий:

long l;
int long il;
long int li;

2 довго:

long long ll;
int long long ill;
long int long lil;
long long int lli;

Також, якщо вище правильно, чи є наступними деклараціями ідентичними?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;

8
Перевірте це (хоча і лише у вашому компіляторі), використовуючи std::swap. Це не складеться, якщо типи не є ідентичними.
Вірсавія


24
Проголосували за повторне відкриття. Передбачуваний дублікат пов'язаний, але це не це питання. Відповідь там не відповідає на це запитання. Близькі виборці: прошу не голосувати за закриття на основі незнання.
Ура та хт. - Альф


Порівняйте розмір (), щоб бути впевненим. Довге довге повинно бути 64 біт, тому розмір (л) повинен бути 8, якщо розмір (поганий) == розмір (ліл), то ваш компілятор бачить їх однаковими. Це буде справедливо для вашого поточного компілятора та будь-яких майбутніх компіляторів, з якими ви можете зіткнутися (до зменшення розміру () - що, сподіваємось, не буде ніколи або у мене є серйозна кількість переписування).
Майкл Стімсон

Відповіді:


136

Відповідно до стандарту C ++ (7.1.6.2 прості специфікатори типу)

3 Якщо дозволено декілька специфікаторів простого типу, їх можна вільно змішувати з іншими специфікаторами decl у будь-якому порядку.

Так, наприклад, наступна декларація є дійсною

long static long const int x = 10;

Ви навіть можете використовувати constexprспецифікатор разом з constкласифікатором. Наприклад

constexpr long static long const int x = 10;

До речі, ми забули про специфікатор signed! Додамо його, наприклад, перед деклараторомx

constexpr long static long const int signed x = 10;

В C ви також можете використовувати кілька класифікаторів типу в одній послідовності декларувати специфікатори. Відповідно до стандарту С (6.7.3 Кваліфікатори типу)

5 Якщо той самий класифікатор відображається неодноразово в одному і тому ж списку специфікаторів-класифікаторів, безпосередньо або через один або кілька типів, поведінка є такою ж, як якщо б вона з’явилася лише один раз ....

Так, наприклад, в С також діє наступна декларація

const long const long static const int const signed x = 10;

Тож якщо вам платять відповідно до кількості символів, набраних у програмі, то я раджу використовувати такі декларації. :)


96
Коли ви абсолютно позитивно повинні бути впевнені, що значення ніколи не зміниться.
Боб

3
@hvd На жаль, зазвичай коментарі виключаються з такого розрахунку.
Влад з Москви

9
Навіть якщо написано як #define REM(...), і тоді для прикладу величезної кількості слів i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.),?


15
Вам навіть не потрібно змішувати класифікаторів ... const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;
складеться

111

Чи однаковий тип ...

Так.

C ++ 11 §7.1.6.2 / 3

" Якщо дозволено декілька простих специфікаторів типу , їх можна вільно змішувати з іншими специфікаторами decl у будь-якому порядку.


2
Прямий стрілок. +1.
einpoklum

42

Так, але будь ласка , не варто . Так само, як англійська та німецька мови мають звичайні порядки слів для прикметників і прислівників (наприклад, час - спосіб - місце), так це роблять C і C ++. Відмінність від звичайного порядку не збиває з пантелику компілятора, але заплутає ваших колег-розробників. Я б припустив, що загальноприйнятий порядок приблизно відповідає лінії

  1. static/ extern(зв'язок)
  2. const/volatile (модифікація)
  3. signed/unsigned (підпис)
  4. short/long (довжина)
  5. Основний тип (головний іменник)

хоча там, звичайно, є якась мерехтіння.


29

"Long long" = "long long int" = "long int long" = "int long long"?

Всі інші відповіді тут говорили про другу частину вашого питання. Перша частина: "Long long" = "long long int"? , відповідь - так .

C ++ 11 7.1.6.2 Специфікатори простого типу (таблиця 10)

Specifier(s)            Type
...                     ...
long long int           long long int
long long               long long int
long int                long int
long                    long int  
...                     ...  

У другій частині вашого питання: "Long int long" = "int long long"? , відповідь знову "так".

Специфікатори типу можуть виникати в будь-якому порядку і можуть бути змішані з іншими специфікаторами декларації. Тому все наступне

long long  
long long int  
long int long  
int long long  

є дійсними та рівнозначними.


3
Я не розумію, чому ви не покращуєте @Cheers та hth. - Альф натомість відповідає.
Себастьян Мах

8
@phresnel; Тому що всі інші відповіді охоплюють лише половину. Усі, що стосуються змішування специфікатора формату, у першій половині запитання відсутнє в заголовку: "Long long" = "long long int" = "long int long" = "int long long"?
хаки

5
@phresnel Деякі люди відповідають за стимули отримати респ. Редагування чужої відповіді для покриття другої половини відповіді - це велика робота для ефективного надання кредиту комусь іншому.

1
Правда. Спочатку це виявилося лише незначним доповненням. (CC: @Thebluefish)
Себастьян Мах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.