Является ли «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;
ggrr
источник
8
Протестируйте это (хотя только на вашем компиляторе), используя std::swap. Это не скомпилируется, если типы не идентичны.
Вирсавия
1
Связанный: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
Проголосовал за открытие. Предполагаемый дубликат связан, но это не тот вопрос. Ответ там не отвечает на этот вопрос. Близкие избиратели: пожалуйста, не голосуйте за закрытие на основании невежества.
ура и hth. - Альф
Сравните sizeof () каждый, чтобы быть уверенным. Длинное long должно быть 64 бит, поэтому sizeof (l) должно быть 8, если sizeof (ill) == sizeof (lil), то ваш компилятор видит их одинаково. Это будет справедливо для вашего текущего компилятора и любых будущих компиляторов, с которыми вы можете столкнуться (вплоть до кончины sizeof (), который, мы надеемся, никогда не произойдет, или мне придется серьезно переписать).
Майкл Стимсон

Ответы:

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 Если один и тот же спецификатор появляется более одного раза в одном и том же списке спецификаторов-спецификаторов, либо напрямую, либо через одну или несколько типов определений, поведение такое же, как если бы оно появилось только один раз ....

Так, например, в C также допустимо следующее объявление

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;прекрасно компилируется в C :-)
Lucas Trzesniewski
111

Тип идентичен ...

Да.

C ++ 11 §7.1.6.2 / 3

« Когда допускается несколько спецификаторов простого типа , они могут свободно смешиваться с другими спецификаторами decl в любом порядке.

Ура и hth. Альф
источник
2
Стрелок прямо. +1.
einpoklum
42

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

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

хотя, конечно, есть какая-то комната для маневра.

Hobbs
источник
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  

действительны и эквивалентны.

haccks
источник
3
Я не понимаю, почему вы не улучшаете @Cheers и hth. - Ответь вместо этого.
Себастьян Мах
8
@phresnel; Потому что все остальные ответы покрывают только половину. Все рассмотренные вопросы о смешивании спецификатора формата отсутствуют в первой половине вопроса в заголовке: «long long» = «long long int» = «long int long» = «int long long»?
хак
5
@phresnel Некоторые люди отвечают за стимул получения репутации. Редактирование чужого ответа, чтобы охватить другую половину ответа, - это большая работа для того, чтобы эффективно отдать кому-то честь.
1
Правда. Сначала это выглядело как незначительное дополнение. (CC: @Thebluefish)
Себастьян Мах