Ist "long long" = "long long int" = "long int long" = "int long long"?


153

Ich habe beide gefunden long int longund int long longkann für einen Variablentyp kompilieren. Gibt es einen Unterschied zwischen long int long, int long long, long longund long long int?

Ist der Typ im Allgemeinen identisch, wenn er die gleiche Anzahl von hat long?

1 lang:

long l;
int long il;
long int li;

2 lang:

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

Auch wenn oben richtig ist, sind die folgenden Erklärungen auch identisch?

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

8
Testen Sie es (wenn auch nur auf Ihrem Compiler) mit std::swap. Dies wird nicht kompiliert, wenn die Typen nicht identisch sind.
Bathseba


24
Zur Wiedereröffnung gewählt. Das angebliche Duplikat ist verwandt, aber es ist nicht diese Frage. Die Antwort dort beantwortet diese Frage nicht. Enge Wähler: Bitte stimmen Sie nicht aus Unwissenheit ab, um zu schließen.
Prost und hth. - Alf


Vergleichen Sie die Größe von (), um sicherzugehen. Ein Long Long sollte 64 Bit sein, also sollte sizeof (l) 8 sein. Wenn sizeof (ill) == sizeof (lil) ist, sieht Ihr Compiler sie gleich. Dies gilt für Ihren aktuellen Compiler und alle zukünftigen Compiler, auf die Sie möglicherweise stoßen (bis zum Ende von sizeof () - was hoffentlich nie der Fall sein wird oder ich ernsthaft umschreiben muss).
Michael Stimson

Antworten:


136

Gemäß dem C ++ Standard (7.1.6.2 Einfache Typspezifizierer)

3 Wenn mehrere einfache Typspezifizierer zulässig sind, können sie in beliebiger Reihenfolge frei mit anderen Deklarationsspezifizierern gemischt werden.

So ist beispielsweise die folgende Deklaration gültig

long static long const int x = 10;

Sie können sogar den constexprBezeichner zusammen mit dem constQualifizierer verwenden. Beispielsweise

constexpr long static long const int x = 10;

Übrigens haben wir den Spezifizierer vergessen signed! Fügen wir es zum Beispiel vor dem Deklarator hinzux

constexpr long static long const int signed x = 10;

In C können Sie auch mehrere Typqualifizierer in derselben Deklarationsspezifikatorsequenz verwenden. Gemäß C-Standard (6.7.3 Typqualifizierer)

5 Wenn dasselbe Qualifikationsmerkmal mehrmals direkt oder über ein oder mehrere Typedefs in derselben Spezifikator-Qualifikator-Liste vorkommt, ist das Verhalten dasselbe, als ob es nur einmal vorkommt ....

So gilt beispielsweise in C auch die folgende Deklaration

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

Wenn Sie also nach der Anzahl der im Programm eingegebenen Symbole bezahlt werden, empfehle ich Ihnen, solche Erklärungen zu verwenden. :) :)


96
Wenn Sie unbedingt sicher sein müssen, dass sich der Wert niemals ändert.
Bob

3
@hvd Leider sind Kommentare normalerweise von einer solchen Berechnung ausgeschlossen.
Vlad aus Moskau

9
Auch wenn wie geschrieben #define REM(...)und dann als Beispiel für eine große Wortzahl 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
Sie müssen nicht einmal die Qualifikation 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;mischen ... kompiliert gut in C :-)
Lucas Trzesniewski

111

Ist der Typ identisch ...

Ja.

C ++ 11 §7.1.6.2 / 3

Wenn mehrere einfache Typspezifizierer zulässig sind, können sie in beliebiger Reihenfolge frei mit anderen Deklarationsspezifizierern gemischt werden.


2
Straight Shooter. +1.
Einpoklum

42

Ja, aber bitte nicht . So wie Englisch und Deutsch herkömmliche Wortreihenfolgen für Adjektive und Adverbien haben (z. B. Zeit - Art - Ort), so haben auch C und C ++. Abweichungen von der herkömmlichen Reihenfolge verwirren den Compiler nicht, aber Ihre Mitentwickler. Ich würde vorschlagen, dass die konventionelle Reihenfolge in etwa der von entspricht

  1. static/ extern(Verknüpfung)
  2. const/ volatile(Änderung)
  3. signed/ unsigned(Unterschrift)
  4. short/ long(Länge)
  5. Grundtyp (Hauptsubstantiv)

obwohl es sicherlich etwas Spielraum gibt.


29

Ist "long long" = "long long int" = "long int long" = "int long long"?

Alle anderen Antworten hier sprachen über den zweiten Teil Ihrer Frage. Für den ersten Teil: Ist "long long" = "long long int"? Antwort ist ja .

C ++ 11 7.1.6.2 Einfache Typspezifizierer (Tabelle 10)

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

Für den zweiten Teil Ihrer Frage: Ist "long int long" = "int long long"? Antwort ist wieder ja.

Die Typspezifizierer können in beliebiger Reihenfolge auftreten und können gemischt werden mit den anderen Deklarationsspezifizierern werden. Daher alle folgenden

long long  
long long int  
long int long  
int long long  

sind gültig und gleichwertig.


3
Ich verstehe nicht, warum Sie @Cheers und hth nicht verbessern. - Alf antworte stattdessen.
Sebastian Mach

8
@phresnel; Weil alle anderen Antworten nur die Hälfte abdecken. Bei allen Fragen zur Vermischung von Formatspezifizierern fehlt die erste Hälfte der Frage im Titel: Ist "long long" = "long long int" = "long int long" = "int long long"?
Haccks

5
@phresnel Einige Leute antworten für den Anreiz, Repräsentanten zu gewinnen. Das Bearbeiten der Antwort eines anderen, um die andere Hälfte einer Antwort abzudecken, ist eine Menge Arbeit, um jemand anderem effektiv Anerkennung zu schenken.

1
Wahr. Dies erschien zunächst nur als geringfügige Ergänzung. (CC: @Thebluefish)
Sebastian Mach
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.