2011-09-17 6 views
7

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 ...)

+2

Il tuo strumento di analisi statica è probabilmente sbagliato. Che strumento stai usando e quali sono gli errori che ti dice? – nos

+0

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. –

risposta

8

In primo luogo, chiariamo alcuni termini. Nulla può causare un "cast implicito", perché non esiste una cosa del genere. A cast è un operatore esplicito, costituito da un nome di tipo tra parentesi che precede un'espressione, ad esempio (double)42; specifica una conversione . Le conversioni possono essere esplicite (specificate da un operatore di cast) o implicite, come in double x = 42;. Quindi quello che stai veramente chiedendo è se le parentesi possono causare una conversione implicita .

E la risposta, almeno nel codice che ci hai mostrato, è no.

Citando il C99 standard (3.7 MB PDF), sezione 6.5.1p5:

Un'espressione tra parentesi è un'espressione primaria. Il tipo e il valore sono identici a quelli dell'espressione non parzializzata.È un lvalue , un identificatore di funzione o un'espressione void se l'espressione non paragonata è, rispettivamente, un lvalue, una funzione designatore o un'espressione void.

E dal momento che è già un 256Uprimary expression, le parentesi non fanno differenza a tutti; le parentesi generalmente indicano la precedenza, ma in questo caso non vi è alcun predecence da indicare.

Quale strumento di analisi statica stai utilizzando? Probabilmente dovresti inviare una segnalazione di bug.

+1

+1 per chiarire la definizione di cast –

+0

+1 da parte mia per lo stesso. Sarò più attento con la terminologia in futuro. – talkaboutquality

4

Lo strumento è confuso in qualche modo. Non c'è casting qui. Quelle parentesi indicano solo la precedenza.