Czy „long long” = „long long int” = „long int long” = „int long long”?

153

Znalazłem oba long int longi int long longmogę skompilować dla typu zmiennej. Czy jest jakaś różnica między long int long, int long long, long longi long long int?

Ogólnie rzecz biorąc, czy typ jest identyczny, jeśli ma taką samą liczbę long?

1 długi:

long l;
int long il;
long int li;

2 długie:

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

Jeśli powyższe jest słuszne, czy poniższe deklaracje również są identyczne?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;
ggrr
źródło
8
Przetestuj go (choć tylko na swoim kompilatorze) przy użyciu std::swap. Nie zostanie to skompilowane, jeśli typy nie są identyczne.
Batszeba
1
Związane z: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
Zagłosowano na ponowne otwarcie. Domniemany duplikat jest powiązany, ale to nie jest to pytanie. Odpowiedź tam nie odpowiada na to pytanie. Głosujący blisko: proszę nie głosować za zamknięciem z powodu ignorancji.
Pozdrawiam i hth. - Alf
Porównaj sizeof () dla pewności. Długi long powinien mieć 64 bity, więc sizeof (l) powinien wynosić 8, jeśli sizeof (ill) == sizeof (lil) to twój kompilator widzi je tak samo. To będzie prawdziwe dla aktualnego kompilatora oraz wszelkich przyszłych kompilatory, które mogą wystąpić (aż do upadku sizeof () - która, miejmy nadzieję, nigdy nie będzie ani Mam poważne ilości przepisanie do zrobienia).
Michael Stimson

Odpowiedzi:

136

Zgodnie ze standardem C ++ (7.1.6.2 Proste specyfikatory typu)

3 Gdy dozwolonych jest wiele specyfikatorów typu prostego, można je swobodnie mieszać z innymi specyfikatorami typu decl w dowolnej kolejności.

Na przykład ważna jest następująca deklaracja

long static long const int x = 10;

Możesz nawet użyć constexprspecyfikatora wraz z constkwalifikatorem. Na przykład

constexpr long static long const int x = 10;

Przy okazji zapomnieliśmy o specyfikatorze signed! Dodajmy go np. Przed deklaratoremx

constexpr long static long const int signed x = 10;

W języku C możesz także użyć kilku kwalifikatorów typu w tej samej sekwencji specyfikatora deklaracji. Zgodnie ze standardem C (6.7.3 Kwalifikatory typu)

5 Jeśli ten sam kwalifikator pojawia się więcej niż raz na tej samej liście specyfikatorów-kwalifikatorów, bezpośrednio lub za pośrednictwem jednej lub kilku definicji typów, zachowanie jest takie samo, jakby pojawił się tylko raz ...

Na przykład w C obowiązuje również następująca deklaracja

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

Jeśli więc otrzymujesz wynagrodzenie zgodnie z liczbą symboli wpisanych w programie to radzę stosować takie deklaracje. :)

Vlad z Moskwy
źródło
96
Kiedy absolutnie musisz mieć pewność, że wartość nigdy się nie zmieni.
Bob
3
@hvd Niestety zazwyczaj komentarze są wykluczone z takiego obliczenia.
Vlad z Moskwy
9
Nawet jeśli napisane jak #define REM(...), a następnie na przykład ogromnej liczby słów, 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
Nie musisz nawet mieszać kwalifikatorów ... 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;kompiluje się dobrze w C :-)
Lucas Trzesniewski
111

Czy typ jest identyczny ...

Tak.

C ++ 11 §7.1.6.2 / 3

Gdy dozwolonych jest wiele specyfikatorów typu prostego , można je swobodnie mieszać z innymi specyfikatorami typu decl w dowolnej kolejności.

Pozdrawiam i hth. - Alf
źródło
2
Prosty strzelec. +1.
einpoklum
42

Tak, ale proszę nie . Podobnie jak angielski i niemiecki mają konwencjonalne szyki wyrazów dla przymiotników i przysłówków (np. Czas - sposób - miejsce), podobnie C i C ++. Odchodzenie od konwencjonalnej kolejności nie zmyli kompilatora, ale zmyli innych programistów. Sugerowałbym, że konwencjonalna kolejność jest z grubsza podobna do

  1. static/ extern(połączenie)
  2. const/ volatile(modyfikacja)
  3. signed/ unsigned(podpis)
  4. short/ long(długość)
  5. Typ podstawowy

chociaż z pewnością jest trochę miejsca na poruszenie.

Hobbs
źródło
29

Czy „long long” = „long long int” = „long int long” = „int long long”?

Wszystkie inne odpowiedzi dotyczyły drugiej części twojego pytania. Pierwsza część: czy „long long” = „long long int”? odpowiedź brzmi: tak .

C ++ 11 7.1.6.2 Proste specyfikatory typu (tabela 10)

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

W drugiej części pytania: czy „long int long” = „int long long”? odpowiedź brzmi: tak.

Specyfikatory typu mogą występować w dowolnej kolejności i mogą być mieszane z innymi specyfikatorami deklaracji. Dlatego wszystkie poniższe

long long  
long long int  
long int long  
int long long  

są ważne i równoważne.

haccks
źródło
3
Nie rozumiem, dlaczego nie ulepszasz @Cheers i hth. - Zamiast tego odpowiedz Alf.
Sebastian Mach
8
@phresnel; Ponieważ wszystkie inne odpowiedzi obejmują tylko połowę. Wszystko dotyczy mieszania specyfikatora formatu, w którym brakuje pierwszej połowy pytania w tytule: Czy „long long” = „long long int” = „long int long” = „int long long”?
haccks
5
@phresnel Niektórzy odpowiadają za motywację do zdobycia przedstawiciela. Edytowanie cudzej odpowiedzi, aby zakryć drugą połowę odpowiedzi, to dużo pracy, jeśli chodzi o skuteczne uznanie kogoś innego.
1
Prawdziwe. Na początku wydawało się to tylko drobnym dodatkiem. (CC: @Thebluefish)
Sebastian Mach