web-dev-qa-db-fra.com

Est-ce que "long long" = "long long int" = "long int long" = "int long long"?

J'ai trouvé les deux long int long et int long long peut compiler pour un type de variable. Y a-t-il une différence entre long int long, int long long, long long et long long int?

En général, le type est-il identique s'il a le même nombre de 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;

Aussi, si ci-dessus est correct, les déclarations suivantes sont-elles également identiques?

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

Selon la norme C++ (7.1.6.2 Spécificateurs de type simples)

3 Lorsque plusieurs spécificateurs de type simple sont autorisés, ils peuvent être librement mélangés avec d'autres spécificateurs de déclin dans n'importe quel ordre.

Ainsi, par exemple, la déclaration suivante est valide

long static long const int x = 10;

Vous pouvez même utiliser le spécificateur constexpr avec le qualificatif const. Par exemple

constexpr long static long const int x = 10;

Au fait, nous avons oublié le spécificateur signed! Ajoutons-le par exemple avant le déclarateur x

constexpr long static long const int signed x = 10;

En C, vous pouvez également utiliser plusieurs qualificateurs de type dans la même séquence de spécificateurs de déclaration. Selon la norme C (qualificatifs de type 6.7.3)

5 Si le même qualificatif apparaît plusieurs fois dans la même liste de qualificateurs, soit directement, soit via une ou plusieurs typedefs, le comportement est le même que s'il n'apparaissait qu'une fois ....

Ainsi, par exemple, en C, la déclaration suivante est également valide

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

Donc, si vous êtes payé en fonction du nombre de symboles saisis dans le programme, je vous conseille d'utiliser de telles déclarations. :)

132
Vlad from Moscow

Le type est-il identique ...

Oui.

C++ 11 §7.1.6.2/3

Lorsque plusieurs spécificateurs de type simple s sont autorisés, ils peuvent être librement mélangés avec d'autres décl-spécificateurs dans n'importe quel ordre.

110

Oui, mais s'il vous plaît ne pas. Tout comme l’anglais et l’allemand ont des ordres classiques dans Word pour les adjectifs et les adverbes (par exemple, heure - lieu - lieu), il en est de même pour C et C++. Le fait de changer d’ordre conventionnel ne déroutera pas le compilateur, mais confusera vos collègues développeurs. Je dirais que l'ordre conventionnel est à peu près le long des lignes de

  1. static/extern (lien)
  2. const/volatile (modification)
  3. signed/unsigned (signature)
  4. short/long (longueur)
  5. Type de base (nom principal)

bien qu'il y ait certainement une certaine marge de manœuvre.

41
hobbs

Est-ce que "long long" = "long long int" = "long int long" = "int long long"?

Toutes les autres réponses ici ont parlé de la deuxième partie de votre question. Pour la première partie: Est-ce que “long long” = “long long int”?, la réponse est oui.

C++ 11 7.1.6.2 Spécificateurs de type simples (tableau 10)

Specifier(s)            Type
...                     ...
long long int           “long long int”
long long               “long long int”
long int                “long int”
long                    “long int”  
...                     ...  

Pour la deuxième partie de votre question: Est-ce que “long int long” = “long long”?, la réponse est à nouveau oui.

Les spécificateurs de type peuvent apparaître dans n'importe quel ordre et peuvent être mélangés avec les autres spécificateurs de déclaration. Par conséquent, tout ce qui suit

long long  
long long int  
long int long  
int long long  

sont valables et équivalentes.

28
haccks