In questo caso, i parametri ricevuti da printf
saranno di tipo int
.
Prima di tutto, qualsiasi cosa si passa a printf (tranne il primo parametro) subisce "promozioni di default", che significa (tra le altre cose) che char
e short
sono entrambi promossi al int
prima di essere passato. Quindi, anche se quello che stavi passando aveva tipo char, nel momento in cui è arrivato a printf
avrebbe avuto tipo int
. Nel tuo caso, stai utilizzando un carattere letterale, che ha già il tipo int
.
Lo stesso vale per scanf e altre funzioni che richiedono parametri variadici.
secondo luogo, anche senza promozioni predefinite, letterali di caratteri in C ha già tipo int
comunque (§6.4.4.4/10): costante carattere
Un numero intero ha tipo int.
Quindi, in questo caso i valori iniziano con il tipo int
, e non sono promossi - ma anche se si è iniziato con char
s, qualcosa di simile:
char a = 'a';
printf("%d", a);
... cosa printf
riceve sarebbe di tipo int
, non di tipo char
comunque.
fonte
2010-10-18 13:36:41
% d è un numero intero con segno, non dice nulla sul numero di byte coinvolti ... – leppie
@leppie: Tuttavia, deve essere passato con un numero definito di byte e 'printf' deve selezionare un certo numero di byte fuori dallo stack per questo, e questi determinati numeri devono essere uguali. –
''a'' ha tipo' int' non 'char'. –