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

Я обнаружил, что как 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 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;

Ответ 1

В соответствии со стандартом С++ (7.1.6.2 спецификаторы простого типа)

3 Если разрешено несколько спецификаторов простого типа, они могут быть свободно intermixed with other 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 вы также можете использовать несколько спецификаторов типов в той же последовательности спецификаторов объявлений. Согласно стандарту C (классификаторы типов 6.7.3)

5 Если один и тот же определитель появляется более одного раза в одном и том же specifier-qualifier-list, либо напрямую, либо через один или несколько typedefs, поведение такое же, как если бы оно появилось только один раз....

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

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

Итак, если вам платят в соответствии с количеством символов, введенных в программу, я советую вам использовать такие объявления.:)

Ответ 2

Является ли тип идентичным...

Да.

С++ 11 §7.1.6.2/3

" Если разрешено несколько спецификаторов простого типа, их можно свободно перемешать с другими указателями-указателями в любой порядок.

Ответ 3

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

  • static/extern (ссылка)
  • const/volatile (модификация)
  • signed/unsigned (подпись)
  • short/long (длина)
  • Основной тип (головное существительное)

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

Ответ 4

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

Все остальные ответы здесь касались второй части вашего вопроса. Для первой части: "long long" = "long long int"?, Ответ да.

С++ 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  

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