SfondoÈ possibile che parentesi in C causino il cast implicito?
L'ultima volta che ho chiesto se parentesi causavano cast implicito (here), @pmg era abbastanza bello per sottolineare che "Niente in C è fatto sotto int" Ma c'è, la discussione era di circa operatori bit a bit e le parentesi si sono rivelate solo una distrazione.
Introduzione
Di seguito, le parentesi sono l'attrazione principale. Oppure, per essere più noioso ma preciso, gli unici operatori che vedo sono le parentesi e gli operatori di assegnazione.
At this reference about the C parentheses operator, non vedo nulla di parentesi che cambia il tipo (al di fuori della sintassi typecast, che non è questo caso).
Nel frattempo, here's a reference that reminds that there is automatic type conversion on assignment, ma non penso che spiegherà il comportamento dello strumento di analisi statico che descriverò qui.
Come nel mio precedente domanda, "OK" significa che lo strumento di analisi statica fatto non mettere in guardia su un tipo di conversione implicita , e "NON OK" significa che lo ha fatto.
int main(void)
{
unsigned int ui;
int i;
ui = (256U); // NOT OK (*) (1)
i = (256U); // NOT OK (*) (2)
i = 256; // OK
i = 256U; // NOT OK
ui = 256U; // OK (3)
ui = 256; // NOT OK
return(0);
}
Posso capirli tutti tranne i primi due: cosa fanno le parentesi? Se non fanno nulla in modo implicito di typecasting, allora mi aspetterei (1) di essere OK e (2) NON essere OK. Se fanno promozione di tipo automatico di tipi più piccoli di int fino a int, allora mi aspetterei (1) di NON essere OK e (2) di essere OK. Ma questo strumento dice che entrambi NON sono OK.
Si tratta di un errore di strumento di analisi statico, oppure lo strumento è corretto e c'è qualcos'altro che devo imparare sulle conversioni di tipo implicito in C?
(BTW spero che il valore 256 è abbastanza piccolo da non essere la causa di overflow sulla mia macchina ...)
Il tuo strumento di analisi statica è probabilmente sbagliato. Che strumento stai usando e quali sono gli errori che ti dice? – nos
Lo standard C garantisce che il valore di 256 non esagererà, non in aritmetica, non nel preprocessore, a meno che non sia assegnato ad un 'char' di qualche tipo. –