"Long long" = "long long int" = "long int long" = "int long long"?

153

Encontrei os dois long int longe int long longposso compilar para um tipo de variável. Existe alguma diferença entre long int long, int long long, long longe long long int?

Em geral, o tipo é idêntico se tiver o mesmo número de long?

1 tempo:

long l;
int long il;
long int li;

2 longos:

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

Além disso, se acima estiver correto, as seguintes declarações também são idênticas?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;
ggrr
fonte
8
Teste (embora apenas no seu compilador) usando std::swap. Isso não será compilado se os tipos não forem idênticos.
Bathsheba
1
Veja também: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
Votou para reabrir. A suposta duplicata está relacionada, mas não é essa pergunta. A resposta ali não responde a essa pergunta. Eleitores próximos: por favor, não vote para fechar com base na ignorância.
Saúde e hth. #
Compare o tamanho de () cada um para ter certeza. Como um longo longo deve ter 64 bits, então sizeof (l) deve ser 8, se o sizeof (ill) == sizeof (lil), seu compilador os verá da mesma forma. Isso será verdadeiro para o seu compilador atual e para quaisquer futuros compiladores que você possa encontrar (até o desaparecimento de sizeof () - que, esperamos, nunca será ou eu tenho uma quantidade séria de reescrita).
Michael Stimson

Respostas:

136

De acordo com o padrão C ++ (7.1.6.2 Especificadores de tipo simples)

3 Quando vários especificadores de tipo simples são permitidos, eles podem ser livremente misturados com outros especificadores de declínio em qualquer ordem.

Por exemplo, a seguinte declaração é válida

long static long const int x = 10;

Você pode até usar o constexprespecificador junto com o constqualificador. Por exemplo

constexpr long static long const int x = 10;

A propósito, esquecemos o especificador signed! Vamos adicioná-lo, por exemplo, ao declaradorx

constexpr long static long const int signed x = 10;

Em C, você também pode usar vários qualificadores de tipo na mesma sequência de especificador de declaração. De acordo com o Padrão C (6.7.3 Qualificadores de tipo)

5 Se o mesmo qualificador aparecer mais de uma vez na mesma lista de especificadores-qualificadores, diretamente ou por meio de um ou mais typedefs, o comportamento será o mesmo que apareceu apenas uma vez ....

Por exemplo, em C, a seguinte declaração também é válida

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

Portanto, se você é pago de acordo com o número de símbolos digitados no programa, recomendamos que você use essas declarações. :)

Vlad de Moscou
fonte
96
Quando você absolutamente, positivamente, deve ter certeza de que o valor nunca mudará.
Bob
3
@hvd Infelizmente, geralmente os comentários são excluídos desse cálculo.
Vlad de Moscou
9
Mesmo se escrito como #define REM(...), e depois para um exemplo de uma contagem de palavras enorme 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
Você não precisa nem misturar as eliminatórias ... 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 muito bem em C :-)
Lucas Trzesniewski
111

O tipo é idêntico ...

Sim.

C ++ 11 §7.1.6.2 / 3

Quando múltiplas simples do tipo de especificador s aceites, que podem ser livremente misturados com outros decl-especificadores em qualquer ordem.

Felicidades e hth. - Alf
fonte
2
Atirador direto. +1.
einpoklum
42

Sim, mas por favor não . Assim como o inglês e o alemão têm ordens de palavras convencionais para adjetivos e advérbios (por exemplo, horário - modo - local), o mesmo acontece com C e C ++. Variando da ordem convencional não confundirá o compilador, mas confundirá seus colegas desenvolvedores. Eu sugeriria que a ordem convencional é mais ou menos ao longo das linhas de

  1. static/ extern(ligação)
  2. const/ volatile(modificação)
  3. signed/ unsigned(assinatura)
  4. short/ long(comprimento)
  5. Tipo básico (substantivo principal)

embora certamente haja algum espaço de manobra.

hobbs
fonte
29

"Long long" = "long long int" = "long int long" = "int long long"?

Todas as outras respostas aqui falaram sobre a segunda parte da sua pergunta. Para a primeira parte: "long long" = "long long int"? , a resposta é sim .

C ++ 11 7.1.6.2 Especificadores de tipo simples (tabela 10)

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

Para a segunda parte da sua pergunta: "long int long" = "int long long"? , a resposta é sim novamente.

Os especificadores de tipo podem ocorrer em qualquer ordem e podem ser misturados com os outros especificadores de declaração. Portanto, todos os seguintes

long long  
long long int  
long int long  
int long long  

são válidos e equivalentes.

haccks
fonte
3
Não estou entendendo por que você não melhora o @Cheers e o hth. - Alf respondeu em vez disso.
Sebastian Mach
8
@phresnel; Porque todas as outras respostas cobrem apenas metade. Todas as questões abordadas sobre a mistura do especificador de formato estão ausentes na primeira metade da pergunta no título: "long long" = "long long int" = "long int long" = "int long long"?
haccks
5
@phresnel Algumas pessoas respondem pelo incentivo de obter rep. Editar a resposta de outra pessoa para cobrir a outra metade é muito trabalho para dar crédito a outra pessoa.
1
Verdade. No começo, isso apareceu apenas como uma adição menor. (CC: @Thebluefish)
Sebastian Mach