2013-08-24 15 views
10

Se dichiaro questo:carattere letterale in C: è un int o un carattere?

int i = 0 + 'A'; 

è 'A' considerato char o int?

alcune persone potrebbero utilizzare:

int i = 0 + (int)'A'; 

ma è davvero necessario?

+6

Quest'ultimo non è necessario. i caratteri letterali sono di tipo 'int'. – WhozCraig

+2

Anche se ''A'' era di tipo' char', il cast non avrebbe alcun effetto su tutte tranne le piattaforme più esotiche. Per essere precisi, se ''A'' era un tipo di char firmato (' signed char' o 'char' quando è firmato), non ci potrebbe mai essere alcuna differenza, e se' A' era un tipo 'char' senza segno (sia 'unsigned char' o' char' quando non è firmato), quindi 'int' e' char' dovrebbero avere le stesse dimensioni affinché una differenza sia visibile. –

+0

A cosa serve '0 +'? Anche in '0 + 'A'' non ha alcuno scopo e ancor meno :) in' 0 + (int)' A''. –

risposta

13

In C, le costanti di carattere come 'A' sono di tipo int. In C++, sono di tipo char.

In C, il tipo di costante di carattere raramente conta. È garantito che sia int, ma se la lingua è stata modificata per renderlo char, la maggior parte del codice esistente continuerebbe a funzionare correttamente. (Il codice che fa esplicitamente riferimento a sizeof 'A' cambierebbe il comportamento, ma non ha molto senso scrivere a meno che non si stia cercando di distinguere tra C e C++ e ci sono modi migliori e più affidabili per farlo. Ci sono casi che riguardano macro dove sizeof 'A' potrebbe essere ragionevole, non voglio entrare nei dettagli qui)

Nel codice di esempio:

int i = 0 + 'A'; 

0 è di tipo int, ed i due operandi di + sono promossi, se necessario, ad una. tipo comune, quindi il comportamento è esattamente lo stesso in entrambi i casi. Anche questo:

char A = 'A'; 
int i = 0 + A; 

fa la stessa cosa, con A (che è di tipo char) di essere promosso a int. Le espressioni di tipo char sono solitamente, ma non sempre, promosse implicitamente a int.

In C++, le costanti di caratteri sono di tipo char - ma si applicano le stesse regole di promozione. Quando Stroustrup ha progettato C++, ha cambiato il tipo di costanti di carattere per coerenza (è un po 'sorprendente che A sia di tipo int) e per abilitare un sovraccarico più coerente (che C non supporta). Ad esempio, se le costanti carattere C++ erano di tipo int, allora questo:

std::cout << 'A'; 

sarebbe stampare 65, il valore ASCII del 'A' (a meno che il sistema utilizza EBCDIC); ha più senso per la stampa A.

int i = 0 + (int)'A'; 

Il cast non è necessario in C e C++. In C, 'A' è già di tipo int, quindi la conversione non ha alcun effetto. In C++, è di tipo char, ma senza il cast sarebbe comunque convertito implicitamente in int.

Sia in C che in C++, i cast devono essere visualizzati con sospetto. Entrambe le lingue forniscono conversioni implicite in molti contesti e quelle conversioni di solito fanno la cosa giusta. Un cast esplicito sovrascrive la conversione implicita o crea una conversione che altrimenti non avrebbe luogo. In molti casi (ma non tutti), un cast indica un problema che può essere risolto meglio utilizzando una conversione implicita fornita dal linguaggio o modificando una dichiarazione in modo che la cosa che viene convertita sia del tipo giusto in primo luogo.

(come Pascal Cuoq mi ricorda nei commenti, se pianura char è firmato e larga quanto int, quindi un'espressione del tipo char sarà promosso a unsigned int, non int. Questo può avvenire solo se CHAR_BIT >= 16, vale a dire , se l'implementazione è a 16 bit o byte più grandi, e se sizeof (int) == 1, e se pianura char è senza segno. non sono sicuro che in realtà esistano tali implementazioni, anche se capisco che compilatori C per alcuni DSPs hanno CHAR_BIT > 8.)

+1

Quali sono i tuoi riferimenti? Risposta così precisa e bella! Sei un insegnante? –

+0

"In C++, è di tipo char, ma senza il cast sarebbe implicitamente convertito in int" Sai cosa sto per dire, non è vero? Va bene, non lo dirò. –

+1

La commissione MISRA C ha messo giù i piedi collettivi invece di conversioni implicite __ e molte industrie ora usano MISRA C per il controllo qualità. –

10

In C, 'A' il tipo è int (non char). Penso che alcune persone fanno int i = 0 + (int)'A'; in C++ (o rendono il codice utile in entrambi i C++/C).

+1

molto grazie per la risposta. – carlos

+0

in C++ è lo stesso? – carlos

+3

In C++ ''A'' è' char' (non 'int'): ** Prova **' sizeof (' A '), sizeof (int), sizeof (char) 'in C++ e in C entrambi. –

0

In base allo standard ISO C99, il tipo di carattere letterale in C è int.

Tuttavia, i caratteri letterali, come 'c', hanno un intervallo che si adatta a char.
Pertanto, è possibile assegnare un carattere letterale a una variabile char senza perdita di informazioni.

char c = 'c'; /* 'c' is int, but (c == 'c') is true */ 
+0

Qui confondi la domanda con l'altra domanda "Perché alcune funzioni di libreria standard restituiscono un' int' in C? ". Queste due domande sono completamente diverse. La risposta alla domanda "Perché alcune funzioni della libreria standard restituiscono un' int' in C? "Implica il tipo" unsigned char ". La tua risposta non ha senso per entrambe le domande. –

+0

Ho abbandonato il paragrafo EOF. Penso che il resto vada bene. – pablo1977

Problemi correlati