Est-ce que «long long» = «long long int» = «long int long» = «int long long»?

153

J'ai trouvé les deux long int longet je int long longpeux compiler pour un type variable. Est - il une différence entre long int long, int long long, long longet 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 longs:

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;
ggrr
la source
8
Testez-le (mais uniquement sur votre compilateur) en utilisant std::swap. Cela ne compilera pas si les types ne sont pas identiques.
Bathsheba
1
En relation: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
A voté pour la réouverture. Le duplicata présumé est lié mais ce n'est pas cette question. La réponse là-bas ne répond pas à cette question. Électeurs proches: veuillez ne pas voter pour fermer sur la base de l'ignorance.
Bravo et hth. - Alf
Comparez la taille de () chacun pour être sûr. Un long long devrait être de 64 bits, donc sizeof (l) devrait être de 8, si sizeof (ill) == sizeof (lil) alors votre compilateur les voit de la même manière. Ce sera vrai pour votre compilateur actuel et les compilateurs futurs que vous pouvez rencontrer (jusqu'à la disparition de sizeof () - qui nous l' espérons sera jamais ou j'ai une sérieuse quantité de réécriture à faire).
Michael Stimson

Réponses:

136

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

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.

Par exemple, la déclaration suivante est valide

long static long const int x = 10;

Vous pouvez même utiliser un constexprspécificateur avec un constqualificatif. 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éclarateurx

constexpr long static long const int signed x = 10;

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

5 Si le même qualificatif apparaît plus d'une fois dans la même liste de spécifiants-qualificatifs, soit directement, soit via un ou plusieurs typedefs, le comportement est le même que s'il n'apparaissait qu'une seule 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 tapés dans le programme alors je vous conseille d'utiliser de telles déclarations. :)

Vlad de Moscou
la source
96
Lorsque vous devez absolument être sûr que la valeur ne changera jamais.
Bob le
3
@hvd Malheureusement, les commentaires sont généralement exclus d'un tel calcul.
Vlad de Moscou le
9
Même si elle était écrite comme #define REM(...), puis pour un exemple d'un nombre énorme de mot, i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.)?
15
Vous n'avez même pas à mélanger les qualifications ... se const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;compile très bien en C :-)
Lucas Trzesniewski
111

Le type est-il identique ...

Oui.

C ++ 11 §7.1.6.2 / 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.

Bravo et hth. - Alf
la source
2
Bon tireur. +1.
einpoklum
42

Oui, mais ne le faites pas . Tout comme l'anglais et l'allemand ont des ordres de mots conventionnels pour les adjectifs et les adverbes (par exemple temps - manière - lieu), il en va de même pour C et C ++. Varier de l'ordre conventionnel ne confondra pas le compilateur, mais cela déroutera vos collègues développeurs. Je dirais que l'ordre conventionnel est à peu près le type 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 marge de manœuvre.

Hobbs
la source
29

Est-ce que «long long» = «long long int» = «long int long» = «int long long»?

Toutes les autres réponses ici concernaient la deuxième partie de votre question. Pour la première partie: «long long» = «long long int»? , la réponse est oui .

C ++ 11 7.1.6.2 Spécificateurs de types 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: «long int long» = «int long long»? , la réponse est encore 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, tous les éléments suivants

long long  
long long int  
long int long  
int long long  

sont valides et équivalentes.

piratages
la source
3
Je ne comprends pas pourquoi vous n'améliorez pas @Cheers et hth. - Réponse Alf à la place.
Sebastian Mach
8
@phresnel; Parce que toutes les autres réponses ne couvrent que la moitié. Tout est abordé sur le mélange du spécificateur de format manquant la première moitié de la question dans le titre: Est-ce que «long long» = «long long int» = «long int long» = «int long long»?
haccks le
5
@phresnel Certaines personnes répondent de l'incitation à gagner des représentants. Modifier la réponse de quelqu'un d'autre pour couvrir l'autre moitié d'une réponse est beaucoup de travail pour donner efficacement du crédit à quelqu'un d'autre.
1
Vrai. Au début, cela est apparu comme un ajout mineur. (CC: @Thebluefish)
Sebastian Mach