c++ - «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 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;


Answers



Согласно стандарту C ++ (7.1.6.2 простейшие спецификации типа)

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

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

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

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

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

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




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

Да.

C ++ 11 §7.1.6.2 / 3

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




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

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

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




«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  

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