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

C++SyntaxDeclarationLong Integer

C++ Problem Overview


I found both long int long and int long long can compile for a variable type. Is there any difference between long int long, int long long , long long and long long int?

In general, is the type identical if it has the same number of long?

1 long:

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;

Also if above is right, are the following declarations also identical?

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

C++ Solutions


Solution 1 - C++

According to the C++ Standard (7.1.6.2 Simple type specifiers)

> 3 When multiple simple-type-specifiers are allowed, they can be freely > intermixed with other decl-specifiers in any order.

So for example the following declaration is valid

long static long const int x = 10;

You may even use constexpr specifier along with const qualifier. For example

constexpr long static long const int x = 10;

By the way, we forgot about specifier signed! Let's add it for example before declarator x

constexpr long static long const int signed x = 10;

In C you may also use several type qualifiers in the same declare specifier sequence. According to the C Standard (6.7.3 Type qualifiers)

> 5 If the same qualifier appears more than once in the same > specifier-qualifier-list, either directly or via one or more typedefs, > the behavior is the same as if it appeared only once....

So for example in C the following declaration is also valid

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

So if you are paid according to the number of symbols typed in the program then I advise you to use such declarations. :)

Solution 2 - C++

> Is the type identical...

Yes.

C++11 §7.1.6.2/3

> When multiple simple-type-specifiers are allowed, they can be freely intermixed with other decl-specifiers in any order.

Solution 3 - C++

Yes, but please don't. Just as English and German have conventional word orders for adjectives and adverbs (e.g. time - manner - place), so do C and C++. Varying from the conventional order won't confuse the compiler, but it will confuse your fellow developers. I would suggest that the conventional order is roughly along the lines of

  1. static/extern (linkage)
  2. const/volatile (modification)
  3. signed/unsigned (signedness)
  4. short/long (length)
  5. Basic type (head noun)

although there's certainly some wiggle room.

Solution 4 - C++

>Is “long long” = “long long int” = “long int long” = “int long long”?

All other answers here talked about the second part of your question. For the first part: Is “long long” = “long long int” ?, answer is yes.

C++11 7.1.6.2 Simple type specifiers (table 10)
Specifier(s)            Type
...                     ...
long long intlong long intlong longlong long intlong intlong intlonglong int”  
...                     ...  

For the second part of your question: Is “long int long” = “int long long”?, answer is yes again.

The type-specifiers may occur in any order and can be intermixed with the other declaration specifiers. Therefore, all of the following

long long  
long long int  
long int long  
int long long  

are valid and equivalent.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionggrrView Question on Stackoverflow
Solution 1 - C++Vlad from MoscowView Answer on Stackoverflow
Solution 2 - C++Cheers and hth. - AlfView Answer on Stackoverflow
Solution 3 - C++hobbsView Answer on Stackoverflow
Solution 4 - C++haccksView Answer on Stackoverflow