“Long long” = “long long int” = “long int long” = “int long long”?

Ho trovato sia long int long int long long grado di compilare per un tipo variabile. C’è qualche differenza tra long int long , int long long , long long long long int ?

In generale, il tipo è identico se ha lo stesso numero di long ?

1 lungo:

 long l; int long il; long int li; 

2 lungo:

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

Anche se sopra è corretto, anche le seguenti dichiarazioni sono identiche?

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

Secondo lo standard C ++ (7.1.6.2 specificatori di tipi semplici)

3 Quando sono ammessi più specificatori di tipo semplice, possono essere mescolati liberamente con altri decl-specificatori in qualsiasi ordine.

Quindi, ad esempio, la seguente dichiarazione è valida

 long static long const int x = 10; 

Si può anche usare constexpr specificatore di constexpr insieme al qualificatore di const . Per esempio

 constexpr long static long const int x = 10; 

A proposito, ci siamo dimenticati di signed identificatore! Aggiungiamolo per esempio prima di dichiarator x

 constexpr long static long const int signed x = 10; 

In C puoi anche usare diversi qualificatori di tipi nella stessa sequenza identificatore dichiarativa. Secondo lo standard C (6.7.3 Qualificazioni di tipo)

5 Se lo stesso qualificatore appare più di una volta nella stessa lista di qualificatori di specificatori, direttamente o tramite uno o più typedef, il comportamento è lo stesso di se appare solo una volta ….

Quindi, ad esempio in C, è valida anche la seguente dichiarazione

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

Quindi se sei pagato in base al numero di simboli digitati nel programma allora ti consiglio di usare tali dichiarazioni. 🙂

È il tipo identico …

Sì.

C ++ 11 §7.1.6.2 / 3

Quando sono ammessi più identificatori di tipo semplice , possono essere mescolati liberamente con altri declinatori in qualsiasi ordine.

Sì, ma per favore non farlo . Proprio come l’inglese e il tedesco hanno ordini di parole convenzionali per aggettivi e avverbi (ad es. Tempo – modo – luogo), così fanno C e C ++. Variare dall’ordine convenzionale non confonderà il compilatore, ma confonderà i tuoi colleghi sviluppatori. Suggerirei che l’ordine convenzionale è all’incirca sulla falsariga di

  1. static / extern (linkage)
  2. const / volatile (modifica)
  3. signed / unsigned (firma)
  4. short / long (lunghezza)
  5. Tipo base (nome testa)

anche se c’è sicuramente qualche spazio di manovra.

“Long long” = “long long int” = “long int long” = “int long long”?

Tutte le altre risposte qui hanno parlato della seconda parte della tua domanda. Per la prima parte: “long long” = “long long int”? , la risposta è .

C ++ 11 7.1.6.2 Specificatori di tipi semplici (tabella 10)

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

Per la seconda parte della tua domanda: “long int long” = “int long long”? , la risposta è di nuovo sì.

Gli identificatori di tipo possono verificarsi in qualsiasi ordine e possono essere combinati con gli altri specificatori di dichiarazione. Pertanto, tutto quanto segue

 long long long long int long int long int long long 

sono validi e equivalenti.