¿Es “long long” = “long long int” = “long int long” = “int long long”?

153

Encontré ambos long int longy int long longpuedo compilar para un tipo variable. ¿Hay alguna diferencia entre long int long, int long long, long longy long long int?

En general, ¿es el tipo idéntico si tiene el mismo número de long?

1 largo:

long l;
int long il;
long int li;

2 largos:

long long ll;
int long long ill;
long int long lil;
long long int lli;

Además, si lo anterior es correcto, ¿son idénticas las siguientes declaraciones?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;
ggrr
fuente
8
Pruébelo (aunque solo en su compilador) usando std::swap. Esto no se compilará si los tipos no son idénticos.
Betsabé
1
Relacionado: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
Votado para reabrir. El supuesto duplicado está relacionado pero no es esta pregunta. La respuesta allí no responde a esta pregunta. Votantes cerrados: por favor, no voten para cerrar por ignorancia.
Saludos y hth. - Alf
Compare el tamaño de () cada uno para estar seguro. Un largo largo debe ser de 64 bits, por lo que sizeof (l) debe ser 8, si sizeof (ill) == sizeof (lil), entonces su compilador los ve igual. Esto será cierto para su compilador actual y para cualquier compilador futuro que pueda encontrar (hasta la desaparición de sizeof (), que con suerte nunca será o tengo una gran cantidad de reescritura que hacer).
Michael Stimson

Respuestas:

136

De acuerdo con el estándar C ++ (7.1.6.2 Especificadores de tipo simple)

3 Cuando se permiten múltiples especificadores de tipo simple, se pueden mezclar libremente con otros especificadores de declinación en cualquier orden.

Entonces, por ejemplo, la siguiente declaración es válida

long static long const int x = 10;

Incluso puede usar el constexprespecificador junto con el constcalificador. Por ejemplo

constexpr long static long const int x = 10;

Por cierto, nos olvidamos del especificador signed! Agregémoslo, por ejemplo, antes del declaradorx

constexpr long static long const int signed x = 10;

En C también puede usar varios calificadores de tipo en la misma secuencia de declarador de especificador. De acuerdo con el Estándar C (6.7.3 Calificadores de tipo)

5 Si el mismo calificador aparece más de una vez en la misma lista de calificadores-especificadores, ya sea directamente o mediante uno o más typedefs, el comportamiento es el mismo que si apareciera solo una vez ...

Entonces, por ejemplo, en C, la siguiente declaración también es válida

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

Entonces, si se le paga de acuerdo con la cantidad de símbolos escritos en el programa, le aconsejo que use tales declaraciones. :)

Vlad de Moscú
fuente
96
Cuando absolutamente, definitivamente tiene que estar seguro de que el valor nunca cambiará.
Bob
3
@hvd Lamentablemente, los comentarios se excluyen de dicho cálculo.
Vlad desde Moscú
9
Incluso si se escribe así #define REM(...), y después de un ejemplo de una enorme cuenta de la palabra, 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
Ni siquiera tiene que mezclar los calificadores ... 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;compila muy bien en C :-)
Lucas Trzesniewski
111

Es el tipo idéntico ...

Si.

C ++ 11 §7.1.6.2 / 3

" Cuando se permiten múltiples especificadores de tipo simple , se pueden mezclar libremente con otros especificadores de declinación en cualquier orden.

Saludos y hth. - Alf
fuente
2
Tirador recto. +1.
einpoklum
42

Sí, pero por favor no . Así como el inglés y el alemán tienen órdenes de palabras convencionales para adjetivos y adverbios (por ejemplo, tiempo, forma y lugar), también lo hacen C y C ++. Variar del orden convencional no confundirá al compilador, pero sí confundirá a sus compañeros desarrolladores. Sugeriría que el orden convencional es más o menos similar a

  1. static/ extern(enlace)
  2. const/ volatile(modificación)
  3. signed/ unsigned(firma)
  4. short/ long(longitud)
  5. Tipo básico (sustantivo principal)

aunque sin duda hay margen de maniobra.

hobbs
fuente
29

¿Es “long long” = “long long int” = “long int long” = “int long long”?

Todas las demás respuestas aquí hablaron sobre la segunda parte de su pregunta. Para la primera parte: ¿"long long" = "long long int"? La respuesta es .

C ++ 11 7.1.6.2 Especificadores de tipo simple (tabla 10)

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

Para la segunda parte de tu pregunta: ¿"long int long" = "int long long"? , la respuesta es sí otra vez.

Los especificadores de tipo pueden aparecer en cualquier orden y pueden mezclarse con los otros especificadores de declaración. Por lo tanto, todo lo siguiente

long long  
long long int  
long int long  
int long long  

son válidos y equivalentes

hacks
fuente
3
No entiendo por qué no mejoras @Cheers y hth. - Alf responde en su lugar.
Sebastian Mach
8
@phresnel; Porque todas las demás respuestas cubren solo la mitad. Todos abordaron sobre la mezcla del especificador de formato que falta la primera mitad de la pregunta en el título: ¿Es “long long” = “long long int” = “long int long” = “int long long”?
piratea el
55
@phresnel Algunas personas responden por el incentivo de ganar reputación. Editar la respuesta de otra persona para cubrir la otra mitad de la respuesta es mucho trabajo para dar crédito a otra persona de manera efectiva.
1
Cierto. Al principio esto apareció como una pequeña adición. (CC: @Thebluefish)
Sebastian Mach