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
static
/ extern
(linkage) const
/ volatile
(modifica) signed
/ unsigned
(firma) short
/ long
(lunghezza) 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 è sì .
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.