Questa risposta tenta di mostrare perché è necessario il LL
. (Non è facile)
Altre risposte hanno mostrato perché sono necessarie le parentesi.
Calcoliamo tre macro, tutte sono costanti decimali.
#define MAXILL (9223372036854775807LL)
#define MAXIL (9223372036854775807L)
#define MAXI (9223372036854775807)
Anche se MAXI
non ha suffisso, che non lo rende tipo int
. MAXI
avrà il primo tipo in cui si inserisce, sia int
, long
, long long
o un tipo intero esteso.
Anche se MAXIL
ha il suffisso L
, si avrà il primo tipo si adatti, sia long
, long long
o un tipo intero esteso.
Anche se MAXILL
ha il suffisso LL
, si avrà il primo tipo si adatti, sia long long
o un tipo intero esteso.
In ogni caso, le macro hanno lo stesso valore, ma potenzialmente diversi tipi.
Vedere C11dr §6.4.4.1 5 per la determinazione del tipo.
Diamo cercare di stamparli e hanno int
e long
sono a 32-bit e long long
e intmax_t
sono 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
Tutti e tre nell'ultima riga sono corrette secondo quanto tutte e tre le macro sono long long
, il precedente hanno errate corrispondenze di tipo tra l'identificatore di formato e il numero.
Se abbiamo int
è a 32 bit e long
, long long
e intmax_t
sono 64, quindi i seguenti sono corrette.
printf("LI %ld %ld", MAXI, MAXIL);
printf("LLI %lld", MAXILL);
Il tipo larghezza massima intero ha un identificatore di formato di "%" PRIdMAX
. Questa macro non può espandersi a "%ld"
e"%lld"
per adattarsi a MAXI, MAXIL, MAXILL
. È impostato su "%lld"
e i numeri relativi a intmax_t
devono avere lo stesso tipo.In questo caso, è necessario utilizzare long long
e utilizzare solo il modulo MAXILL
.
Altre implementazioni possono avere un esteso tipo intero (come int128_t
), nel qual caso potrebbe essere utilizzato un suffisso specifico attuazione o qualche meccanismo.
Si potrebbe anche discutere di 'a = 7-INT_MAX;' con e senza parentesi attorno a 'INT_MAX', notando che il risultato sarebbe diverso da' a = 7 - INT_MAX; '. –
@JonathanLeffler Come sarebbe il risultato diverso? Non dovresti avere bisogno di parentesi per 'INT_MAX' dato che un intero letterale è un'espressione primaria. –
@EricMSchmidt: _ ... blah, blah ... _ ** ... A meno che ... ** Oh drat! Il processo originale del preprocessore separato tendeva a dare una risposta, ma la versione moderna (come nel 1989 o successiva) tokenizza l'input e l'input rimane tokenizzato, quindi '#define X -7' e' int main (void) {int x = 7-X; ritorno x; } 'produce un programma che esce con lo stato 14. Dovrei averlo ricordato. –