Is "long long" = "long long int" = "long int long" = "int long long"?
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;
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. :)
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.
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
-
static
/extern
(linkage) -
const
/volatile
(modification) -
signed
/unsigned
(signedness) -
short
/long
(length) - Basic type (head noun)
although there's certainly some wiggle room.