Prima di tutto, il valore prodotto da sizeof
è di size_t
di tipo unsigned
. NOTA
Come il tipo unsigned
è superiore rango rispetto al tipo signed
, durante l'esecuzione del confronto, secondo le norme del gestore relazione, vengono eseguite le usuali conversioni aritmetiche, cioè del tipo firmata viene promosso tipo senza segno.
Nel tuo caso, il -1
, se considerato come unsigned
, rappresentano il valore più alto possibile unsigned
, in tal modo, non c'è da meravigliarsi
if (sizeof(int) > -1)
Viene posto a falso.
Morale della favola: Tentativo confronto tra un signed
ed un unsigned
è previsto per produrre risultato strano, proprio come nel tuo caso. È necessario abilitare l'avviso del compilatore e provare a risolvere i problemi segnalati dal compilatore.
NOTA:
Da C11
, capitolo §7.19, <stddef.h>
,
size_t
che è il tipo unsigned
intera del risultato dell'operatore sizeof
.
fonte
2015-08-12 06:29:35
Questo probabilmente sarebbe stato catturato se avessi attivato più avvisi. – VoidStar