Diese Antwort versucht zu zeigen, warum die LL
benötigt wird. (Es ist nicht einfach.)
Andere Antworten haben gezeigt, warum Klammern erforderlich sind.
Lassen Sie uns drei Makros kodieren, alle sind Dezimalkonstanten.
#define MAXILL (9223372036854775807LL)
#define MAXIL (9223372036854775807L)
#define MAXI (9223372036854775807)
Obwohl MAXI
hat keinen Suffix, dass es nicht int
macht eingeben. MAXI
hat den ersten Typ, in den es passt, entweder int
, long
, long long
oder ein erweiterter Integer-Typ.
Obwohl MAXIL
das L
Suffix hat, wird es die erste Art hat sie paßt in entweder long
, long long
oder einen erweiterte Integer-Typ.
Obwohl MAXILL
das LL
Suffix hat, wird es die erste Art hat sie paßt in entweder long long
oder ein erweiterte Integer-Typ.
In jedem Fall haben die Makros den gleichen Wert, aber potenziell verschiedene Typen.
Siehe C11dr §6.4.4.1 5 für die Typbestimmung.
Lasst uns versuchen, sie zu drucken und haben int
und long
sind 32-Bit und long long
und intmax_t
sind 64.
printf("I %d %d %d", MAXI, MAXIL, MAXILL); //Error: type mismatch
printf("LI %ld %ld %ld", MAXI, MAXIL, MAXILL); //Error: type mismatch
printf("LLI %lld %lld %lld", MAXI, MAXIL, MAXILL); //Ok
Alle drei in der letzten Zeile korrekt sind, da alle drei Makros long long
sind, die Vorhergehende haben Typ-Mis-Matches zwischen Formatbezeichner und der Nummer.
Wenn wir int
haben, ist 32-Bit und long
, long long
und intmax_t
64 sind, dann sind die folgenden richtig.
printf("LI %ld %ld", MAXI, MAXIL);
printf("LLI %lld", MAXILL);
Die maximale Breite Integer-Typ hat ein Format-Spezifizierer von "%" PRIdMAX
. Dieses Makro kann nicht auf "%ld"
und"%lld"
erweitert werden, um MAXI, MAXIL, MAXILL
aufzunehmen. Es ist auf "%lld"
eingestellt, und Nummern, die sich auf intmax_t
beziehen, müssen den gleichen Typ haben.In diesem Fall sollten long long
und nur Formular MAXILL
verwendet werden.
Andere Implementierungen können eine erweiterte Integer-Typ (wie int128_t
) haben, wobei in diesem Fall eine Implementierung spezifischer Suffix oder irgendein Mechanismus verwendet werden könnte.
Sie könnten auch 'a = 7-INT_MAX; 'mit und ohne Klammern um' INT_MAX 'diskutieren, wobei Sie bemerken, dass das Ergebnis von' a = 7 - INT_MAX;' abweichen würde. –
@ JonathanLeffler Wie wäre das Ergebnis anders? Sie sollten keine Klammern für 'INT_MAX' benötigen, da ein Integer-Literal ein primärer Ausdruck ist. –
@EricMSschmidt: _ ... blah, blah ... _ ** ... Es sei denn ... ** Oh drat! Der ursprüngliche Prozess des Präprozessors tendierte dazu, eine Antwort zu geben, aber die moderne (wie in 1989 oder später) Version tokenisiert die Eingabe und die Eingabe bleibt in Token, also '#define X -7' und' int main (void) {int x = 7-X; Rückgabe x; } 'ergibt ein Programm, das mit Status 14 beendet wird. Ich hätte mich erinnern sollen. –