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


153

Ho trovato entrambi long int longeint long long posso compilare per un tipo variabile. C'è qualche differenza tra long int long, int long long, long longe 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 lunghi:

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

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

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

8
Provalo (anche se solo sul tuo compilatore) usando std::swap. Questo non verrà compilato se i tipi non sono identici.
Bathsheba,


24
Votato per riaprire. Il presunto duplicato è correlato ma non è questa domanda. La risposta laggiù non risponde a questa domanda. Elettori ravvicinati: non votare per chiudere sulla base dell'ignoranza.
Saluti e hth. - Alf


Confronta il sizeof () ciascuno per essere sicuro. Un long long dovrebbe essere 64 bit quindi sizeof (l) dovrebbe essere 8, se sizeof (ill) == sizeof (lil) allora il tuo compilatore li vede allo stesso modo. Questo sarà vero per il tuo attuale compilatore e per tutti i futuri compilatori che potresti incontrare (fino alla scomparsa di sizeof () - che si spera non sarà mai o ho una seria quantità di riscrittura da fare).
Michael Stimson,

Risposte:


136

Secondo lo standard C ++ (7.1.6.2 Specificatori di tipo semplice)

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

Quindi ad esempio la seguente dichiarazione è valida

long static long const int x = 10;

Puoi anche usare lo constexprspecificatore insieme al constqualificatore. Per esempio

constexpr long static long const int x = 10;

A proposito, ci siamo dimenticati dell'identificatore signed! Aggiungiamolo ad esempio prima del dichiaratorex

constexpr long static long const int signed x = 10;

In C è inoltre possibile utilizzare diversi qualificatori di tipo nella stessa sequenza di specificazione di dichiarazione. Secondo lo standard C (6.7.3 Tipo qualificatori)

5 Se lo stesso qualificatore appare più di una volta nello stesso elenco di specificatori-qualificatori, direttamente o tramite uno o più tipi di errori di battitura, il comportamento è lo stesso come se comparisse solo una volta ....

Quindi ad esempio in C vale anche la seguente dichiarazione

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

Quindi, se vieni pagato in base al numero di simboli digitati nel programma, ti consiglio di utilizzare tali dichiarazioni. :)


96
Quando devi assolutamente, positivamente essere sicuro che il valore non cambierà mai.
Bob,

3
@hvd Purtroppo, di solito, i commenti sono esclusi da tale calcolo.
Vlad da Mosca,

9
Anche se scritto come #define REM(...), e poi per un esempio di un enorme numero di parole, 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
Non devi nemmeno mescolare le qualificazioni ... 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 bene in C :-)
Lucas Trzesniewski,

111

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 specificatori di decl in qualsiasi ordine.


2
Tiratore dritto. +1.
einpoklum,

42

Sì, ma per favore no . Proprio come l'inglese e il tedesco hanno ordini di parole convenzionali per aggettivi e avverbi (ad esempio tempo - modo - luogo), così anche C e C ++. Variare dall'ordine convenzionale non confonderà il compilatore, ma confonderà i tuoi colleghi sviluppatori. Vorrei suggerire che l'ordine convenzionale è all'incirca simile a

  1. static/ extern(collegamento)
  2. const/ volatile(modifica)
  3. signed/ unsigned(firma)
  4. short/ long(lunghezza)
  5. Tipo di base (nome del capo)

anche se c'è sicuramente un po 'di spazio.


29

“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 Identificatori di tipo semplice (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 mescolati con gli altri identificatori di dichiarazione. Pertanto, tutto quanto segue

long long  
long long int  
long int long  
int long long  

sono validi ed equivalenti.


3
Non capisco perché non migliora @Cheers e hth. - Alf risponde invece.
Sebastian Mach,

8
@phresnel; Perché tutte le altre risposte coprono solo la metà. Tutti gli argomenti sull'interazione del specificatore di formato mancano della prima metà della domanda nel titolo: "long long" = "long long int" = "long int long" = "int long long"?
Hawcks

5
@phresnel Alcune persone rispondono per l'incentivo di ottenere un rappresentante. Modificare la risposta di qualcun altro per coprire l'altra metà di una risposta è molto lavoro per dare credito efficacemente a qualcun altro.

1
Vero. All'inizio questo è apparso come un'aggiunta minore. (CC: @Thebluefish)
Sebastian Mach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.